java多线程之线程状态(3)

来源:互联网 发布:阿里云邮箱登陆 编辑:程序博客网 时间:2024/05/18 22:54

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/43247307


作者:小马


本篇是wait和notify方式的线程阻塞示例,



与前面几种方法不同的是,wait()与notify()必须要与synchronized(Obj)一起使用,也就是wait,与notify是针对已经获取了Obj锁进行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj){...}语句块内。
 
wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠,而notify是让调用它的线程对象唤醒(当然是在其它线程里调用的)。


先看代码,还是两个类,

//wait and nofityclass WaitNotify1 extends Blockable{public WaitNotify1(Container c){super(c);}public synchronized void run(){while(true){i++;update();try {wait(100);} catch (InterruptedException e) {System.err.println("interrupted");}}}}class WaitNotify2 extends Blockable{public WaitNotify2(Container c){super(c);new Notifier(this);}public synchronized void run(){while(true){i++;update();try {wait();} catch (InterruptedException e) {System.err.println("interrupted");}}}}class Notifier extends Thread{private WaitNotify2 wn2;public Notifier(WaitNotify2 wn2){this.wn2 = wn2;start();}public void run(){while(true){try {sleep(2000);} catch (InterruptedException e) {System.err.println("interrupted");}synchronized (wn2) {wn2.notify();}}}}




类1和类2的主要区别在于, 类2有一个notifer对象能每隔2s唤醒它一次,因为类2休眠调用的是不带参数的wait,这种只能被主动唤醒。


运行的效果如下:


0 0
原创粉丝点击