1. 程式人生 > >先後有序的wait和notify

先後有序的wait和notify

pri ava zed min star exceptio ktr 有序 ()

這裏先講述 大道揚帆 裏的一個小故事 話說男豬腳揚帆駕馭一葉扁舟在碧海上飄蕩。 一只木漿在揚帆手裏上下翻飛,驚起了層層漣漪。 “把帆揚起來吧,也省些力氣。”夏夏道。 “海風還沒到(signal),現在揚帆還早。我現在先瞇會,等到(wait)大風起來的時候,才能借風之力遨遊九天之上。” /** * wait和notify需要在同步方法或者同步代碼塊中使用, * 否則會報 java.lang.IllegalMonitorStateException * @author Administrator * */ public class 遠航 { public static void main(String[] args) throws InterruptedException { Object 海風將起 = new Object(); 揚帆 豬腳揚帆 = new 揚帆(海風將起); 海風 外力海風 = new 海風(海風將起); 豬腳揚帆.start(); // 豬腳先起個線程瞇一會。 外力海風.start(); /** * 海風遲遲不來,還是讓男豬腳賣力劃吧 */ // 豬腳揚帆.interrupt(); } } public class 揚帆 extends Thread { private Object 海風將起; public 揚帆(Object 海風將起) { this.海風將起 = 海風將起; } @Override public void run() { try { synchronized (海風將起) { 海風將起.wait(); } System.err.println("揚帆: 海風來了,終於可以歇會了!"); } catch (InterruptedException e) { e.printStackTrace(); System.err.println("揚帆: 不用等海風了"); } } } public class 海風 extends Thread { private Object 海風將起; public 海風(Object 海風將起) { this.海風將起 = 海風將起; } @Override public void run() { System.err.println("海風: 還沒來,你們再等等吧......"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println("海風: 來了,通知揚帆......"); synchronized (海風將起) { 海風將起.notify(); // 海風將起.notifyAll()通知揚帆和夏夏; } } }

先後有序的wait和notify