并发编程(6)Object类对线程的操作(wait/notify/notifyAll)

Java Object 类也提供了线程操作的方法,下面我们来了解一下

.1)wait

wait()方法为Object类的方法,主要用于线程间通信,调用wait()方法的时候,线程会放弃对象锁(sleep 不会放弃对象锁),进入等待此对象的等待锁定池,只有针对此对象调用notify()方法(或notifyAll())后本线程才进入对象锁定。

注:如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法),因为wait方法放弃了对象锁,所以同步代码块可以被访问。

public class TestWait {
	
	private Object obj=new Object();
	
	class WaitTread1 extends Thread{

		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+":begin");
			synchronized(obj){
				try {
					obj.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName()+":end");
		}
	}
	
	class WaitThread2 extends Thread{

		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+":begin");
			synchronized (obj) {
				obj.notify();
			}
			System.out.println(Thread.currentThread().getName()+":end");
		}
		
	}
	
	public static void main(String[] args) {
		TestWait tw=new TestWait();
		WaitTread1 wt1=tw.new WaitTread1();
		WaitThread2 wt2=tw.new WaitThread2();
		wt1.start();
		wt2.start();
		
	}

}
执行结果:

Thread-0:begin
Thread-1:begin
Thread-1:end
Thread-0:end

由结果我们可以看出,线程Thread-0在调用wait()方法后,Thread-1访问了obj对象,说明Thread-0放弃了obj的对象锁,同时Thread-0是在Thread-1执行notify()方法后被唤醒的。

.2)notify notifyAll

notify()和notifyAll()方法也同样是Object类的方法,notify()方法能够唤醒一个正在等待该对象锁的线程,当有多个线程都在等待该对象的锁的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知,nofityAll()方法能够唤醒所有正在等待该对象的锁的线程。


你可能感兴趣的:(线程)