JDK提供了两个非常重要的接口线程等待 wait()方法和通知notify()方法。这两个方法是 Object类方法,也就意味着任何对象都可以调用这两个方法。
如果一个线程调用了wait()方法,那么他就会进入 object 对象的等待队列,在这个等待队列中,可能会有多个线程,因为系统运行多个线程同时等待某一个对象。当notify()被调用时,它就会从这个等待队列中,随机挑选一个线程,将其唤醒。还有一个类似的 notifyAll()方法,它和 notify() 功能基本一致,唯一不同的是它会唤醒所有等待的线程。
不过需要注意的是,无论是 wait()或者 notify()都需要首先获得目标对象的一个监视器,wait()释放锁,而notify()不会释放锁。
/**
* Created by zhangjianghong on 2017/7/31.
*/
public class SimpleWN {
final static Object object = new Object();
public static class T1 extends Thread {
@Override
public void run() {
synchronized (object){
System.out.println(System.currentTimeMillis() + ": T1 Start! ");
try {
System.out.println(System.currentTimeMillis() + ": T1 wait for Obj! ");
object.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(System.currentTimeMillis()+": T1 end ! ");
}
}
}
public static class T2 extends Thread {
@Override
public void run() {
synchronized (object){
System.out.println(System.currentTimeMillis() + ": T2 Start! notify one thread ");
object.notify();
System.out.println(System.currentTimeMillis()+": T2 end ! ");
try {
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Thread t1 = new T1();
Thread t2 = new T2();
t1.start();
t2.start();
}
}
线程2 在执行object.notify()后并不会立即释放锁,而是等执行完毕再释放锁,即使它已经通知了线程一。所以会有以下结果。