2019独角兽企业重金招聘Python工程师标准>>>
这里主要研究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();
}