标签:
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法
两者的最大区别在于:
多个线程拥有同一个同步对象时,用notifyAll会造成异常的实例
import java.util.ArrayList; import java.util.List; class Widget{} class WidgetMaker extends Thread{ List finishedWidgets = new ArrayList(); public void run(){ try{ while(true){ // 每5s产生对象加入List Thread.sleep(5000); Widget w = new Widget(); Widget i = new Widget(); Widget d = new Widget(); synchronized (finishedWidgets) { finishedWidgets.add(w); finishedWidgets.add(i); finishedWidgets.add(d); // 向List加入3个元素后通知wait对象唤醒 // 如果此处使用notifyAll(),第一个线程得到了锁,而其他线程也从wait状态被唤醒执行remove命令,部分List会出现空元素remove出现异常,notify则只选择当前wait状态线程进行唤醒,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们 finishedWidgets.notify(); } } }catch(InterruptedException e) {} } // 如果List中有就一直返回,直到List为空时wait public Widget waitForWiget() { synchronized (finishedWidgets) { if (finishedWidgets.size() == 0) { try { finishedWidgets.wait(); } catch (InterruptedException e) { } } return (Widget) 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.waitForWiget(); 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 notify()和notifyAll()同步唤醒上的区别
标签:
原文地址:http://www.cnblogs.com/updateofsimon/p/4499720.html