Java notify(),wait(),notifyAll

拜託各位耶穌神手,此處小弟腦袋實在快燒掉了...

還是搞不清楚~可否請您舉例執行緒中notify(),wait(),notifyAll,synchronized(this){這4個有什麼不同及用處呢且若不加其中一個又有甚麼差別如下面這程式...

public class NewMain595 {

public static void main(String[] args) {

MyRunnable05 r=new MyRunnable05();

Thread t1=new Thread(r);

Thread t2=new Thread(r);

Thread t3=new Thread(r);

t1.setName("小明");

t2.setName("小華");

t3.setName("小強");

t1.start();

t2.start();

t3.start();

}

}

class MyRunnable05 implements Runnable{

public void run(){

synchronized(this){

for(int i=1;i<=10;i++){

System.out.println("我是"+Thread.currentThread().getName()+"\t 第"+i+"次");

try{

notify();//我有跟沒有是否一樣

Thread.sleep(1000);

if(i<=10)

System.out.println("我是"+Thread.currentThread().getName()+"停住了");

wait();//如果去掉那...有加notify();跟沒加有什麼差

}

catch(Exception ex){}

}

}

}

}

也可否請耶穌神手您解釋這段程式是如何跑低呢><?

就像這樣的問題:notify();//我有跟沒有是否一樣

就像這樣的問題:wait();//如果去掉那...有加notify();跟沒加有什麼差

2 Answers

Rating
  • 1 decade ago
    Favorite Answer

    首先你要了解執行緒是神末東西 ,以你的程式來說 你產生了3個執行緒

    (小明,小華,小強) ,沒有notify, wait, synchronized 時,程式執行時會怎麼跑

    ....答案是(不控制)

    所以 沒有notify, wait, synchronized 時執行是隨機的誰先誰後沒控制

    當我們加上synchronized 時 執行結果為 小明執行10次完後,小強執行10次,

    再來小華執行10次,也就是說 小明小華小強 不同時執行

    再來是 有synchronized ,notify時 執行結果和 synchronized 一樣,原因是

    notify 是通知其他執行緒可執行,沒有wiat 自己執行緒也不停,所以啦 大家都不停

    但受到 synchronized 影響所以 執行結果和 synchronized 一樣.

    接下來說有 synchronized ,wait 時執行結果為

    小明 第1次

    我是小明停住了

    小強 第1次

    我是小強停住了

    小華 第1次

    我是小華停住了

    小明先執行,執行到 wait ,換小強 ,也執行到 wait ,換小華 ,還是執行到wait

    因為沒有執行notify通知其他執行緒 所以 大家都 wait 了

    再來是 synchronized ,notify , wait 都有時....結果

    小明 第1次

    我是小明停住了

    小強 第1次

    我是小強停住了

    小華 第1次

    我是小華停住了

    小強 第2次

    我是小強停住了

    小華 第2次

    我是小華停住了

    小強 第3次

    我是小強停住了

    小華 第3次

    我是小華停住了

    小強 第4次

    我是小強停住了

    小華 第4次

    我是小華停住了

    小強 第5次

    我是小強停住了

    小華 第5次

    我是小華停住了

    小明 第2次

    我是小明停住了

    小明執行第一次時 ,執行notify 再到 wait 這時 小明等了

    再來小強或小華會執行,因為小明有notify..

    這裡是 小強搶到執行…小強也執行 第一次 執行 notify再到 wait這時 小強也等了

    再來小明或小華會執行,因為小強有notify..

    這裡是 小華搶到執行…小華也執行 第一次 執行 notify再到 wait這時 小華也等了

    再來小明或小強會執行,因為小華有notify..

    這裡是 小強搶到執行…小強也執行 第二次 執行 notify再到 wait這時 小強也等了

    ……….依此類推

    最後2個人執行完 會有一人 在等 …

    為何notify 執行後 一定要到 wait 時 其它執行續才會執行 因為 synchronized 有鎖著的關係

    其實有流程圖會更好了解,說穿了程式語言幹麻要有這末多函式,語法

    在流程控制上會需要的,所以它發明這些語法,函數.

    我要作到 每個流程做一次 輪另一流程做一次 ….這功能就是 wait ,notify

    Source(s): me
    • Login to reply the answers
  • ?
    Lv 4
    1 decade ago

    我將原程式做小修改,在呼叫notify及wait的前後增加訊息的輸出,這會對觀看執行過程有幫助

    原迴圈執行10次,每次休息1秒,請自行修改為合理的次數及時間,以增進觀察的效率

    請試著註解我標示comment的地方共三組來觀察各種組合的結果(comment後方的數字為組別)

    因字數過多的關係,我將他貼在我的blog中

    http://tw.myblog.yahoo.com/jw!Lh5CNRWBSE79KvlwKKyu...

    以上請參考,並請先試著自行觀察並理解,如有問題請再補充

    2009-08-27 22:19:27 補充:

    這種問題就讓他自己去理解就好了,講這麼多做什麼?等他再理解錯誤時,針對他的理解錯誤去解釋就好了。

    • Login to reply the answers
Still have questions? Get your answers by asking now.