正确理解wait()和notify()方法

来源:互联网 发布:航天科工33所 知乎 编辑:程序博客网 时间:2024/06/05 17:33

wait和notify是根类Object两个方法。任何类都可以调用该方法。

下面代码实现两个线程通信方式。来自《java程序员面试秘籍》

package myself;public class Syn {public static void main(String[] args) {TwoPeople.ONE.start();TwoPeople.TWO.start();}}class TwoPeople extends Thread{private int i = 0;static Thread ONE = new TwoPeople(1);static Thread TWO = new TwoPeople(2);static Object washroom = new Object();private TwoPeople(int i){this.i = i;}private void brush(){System.out.println("people"+i+" is brushing");try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("people"+i+" has brushed");}private void release(){System.out.println("People "+i+" is releasing!");try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("People "+i+" has released!");}@Overridepublic void run() {//我们加锁的对象是washroom,而不是this对象。所以我们调用的是washroom.wait()和washroom.notify().
<span style="white-space:pre"></span>//如果省去washroom.会抛出IllegalMonitorStateException。因为this对象上没有加锁。synchronized(washroom){try{if(i==1){brush();<strong><span style="color:#ff0000;">washroom.wait();</span></strong>//添加当前线程到washroom的等待集中release();<strong><span style="color:#ff0000;">washroom.notify()</span></strong>;}else{brush();<span style="color:#ff0000;"><strong>washroom.notify();washroom.wait();</strong></span>release();}}catch(InterruptedException e){e.printStackTrace();}}}}

0 0
原创粉丝点击