非常好的教学例子.
转自http://blog.csdn.net/SuperMiner/archive/2007/04/22/1574615.aspx
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:
notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
下面是一个很好的例子:
import java.util.*;
class Widget...{} class WidgetMaker extends Thread...{ List<Widget> finishedWidgets=new ArrayList<Widget>(); public void run()...{ try...{ while(true)...{ Thread.sleep(5000);//act busy Widget w=new Widget(); //也就是说需要5秒钟才能新产生一个Widget,这决定了一定要用notify而不是notifyAll //因为上面两行代码不是同步的,如果用notifyAll则所有线程都企图冲出wait状态 //第一个线程得到了锁,并取走了Widget(这个过程的时间小于5秒,新的Widget还没有生成) //并且解开了锁,然后第二个线程获得锁(因为用了notifyAll其他线程不再等待notify语句 //,而是等待finishedWidgets上的锁,一旦锁放开了,他们就会竞争运行),运行 //finishedWidgets.remove(0),但是由于finishedWidgets现在还是空的, //于是产生异常 //***********这就是为什么下面的那一句不能用notifyAll而是要用notify synchronized(finishedWidgets)...{ finishedWidgets.add(w); finishedWidgets.notify(); //这里只能是notify而不能是notifyAll } } } catch(InterruptedException e)...{} } public Widget waitForWidget()...{ synchronized(finishedWidgets)...{ if(finishedWidgets.size()==0)...{ try...{ finishedWidgets.wait(); } catch(InterruptedException e) ...{} } return finishedWidgets.remove(0); } } } public class WidgetUser extends Thread...{ private WidgetMaker maker; public WidgetUser(String name,WidgetMaker maker)...{ super(name); this.maker=maker; } public void run()...{ Widget w=maker.waitForWidget(); System.out.println(getName()+"got a widget"); }
public static void main(String[] args) ...{ WidgetMaker maker=new WidgetMaker(); maker.start(); new WidgetUser("Lenny",maker).start(); new WidgetUser("Moe",maker).start(); new WidgetUser("Curly",maker).start();
}
}
|
分享到:
相关推荐
Java 同步方式 wait和notify/notifyall
本文主要介绍Java notify和notifyAll的知识,这里整理详细的资料来说明notify 和NotifAll的区别,有需要的小伙伴可以参考下
在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
本篇文章对Java中多线程notify与notifyall的区别进行了详细的分析介绍。需要的朋友参考下
主要介绍了 java notify和notifyAll的对比的相关资料,需要的朋友可以参考下
1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程顺序打印问题2.1.1 题目2.1.2 题目分析2.1.3 我的答案2.2 生产者消费者问题2.2.1 题目2.2.2 题目分析2.2.3 我的答案 源码...
源码—Java多线程5—死锁和wait notify notifyAll
wait()、notify()和notifyAll()方法1---马克-to-win java视频
wait()、notify()和notifyAll()方法2---马克-to-win java视频
一个简单的线程同步机制,也能实例了解wait notify的使用,notify与notifyAll的区别
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...
3(深入理解Wait、Notify和Wait与sleep区别).rar
主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
很多朋友对java中的notyfy()和notifyAll()的本质区别不了解,今天小编抽空给大家整理一篇教程关于Java中的notyfy()和notifyAll()的本质区别,需要的朋友参考下吧
Java多线程同步(wait()notify()notifyAll())[文].pdf
notify和notifyAll的区别; 12。写代码来反转list; 13。抽象类和接口有什么不同; 14。常用的布局管理器有哪几种,那个会变形,哪个不会; 15。写代码来算数组1,-3,8,9,23,-34,-8,3,4,67,9最大和的子串;
java中多线程编程notify、wait的使用
WM_NOTIFY消息流程实例分析---对应博客代码