先後有序的wait和notify
阿新 • • 發佈:2018-09-07
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