这里主要研究Object的方法wait()、notify()和notifyAll()来安全的实现进程间的握手。此外java se5并发类库提供了具有await()和signal()方法的Condition对象。注意wait()、notify()和notifyAll()方法只能在同步控制方法或同步控制块里调用。
wait()方法有两种形式。第一种为接受毫秒数作为参数,含义与sleep()方法里参数的意思相同。但与sleep()不同的是,对于wait()而言:
1)在wait期间对象锁是释放的
2)通过notify()和notifyAll(),或者令时间到期,从wait()中恢复执行
第二种是不接受任何参数。这种方法无限等待下去,直到线程接收到notify()和notifyAll()方法。
例子:
class Thread2 extends Thread{ int total; public void run(){ synchronized(this){ for(int i=0;i<101;i++){ total+=i; } try { sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } notify(); } }}public class Thread1 { public static void main(String[] args){ Thread2 b = new Thread2(); b.start(); synchronized(b){ try{ System.out.println("等待对象b完成计算。。。"); b.wait(); }catch (Exception e) { e.printStackTrace(); } System.out.println("b对象计算的总和是:" + b.total); } }}
等待对象b完成计算。。。 b对象计算的总和是:5050
注意当在对象上调用wait()方法时,执行该代码的线程立即放弃它在对象上的锁。然而调用notify()时,并不意味着这时线程会放弃其锁。
如果要向对象x发送notifyAll(),那么就必须在能够取得x的锁的同步控制块中这么做
synchronized(x){ x.notifyAll();}