分析:我們期望的結果是,當輸入執行緒一次(input)操作資源(res)後,我們希望輸入執行緒 (input)失去執行權,讓輸出執行緒(output)獲取cpu執行權,當輸出執行緒(output)一次列印完成後,我們希望輸出執行緒(output)失去執行權,這時候讓輸入執行緒(input)獲取執行權,以此類推。那麼,我們理解起來就比較簡單,當輸入或者輸出執行緒執行一次完成後,自身要失去執行資格,並」叫醒」對方繼續執行。. .
先看下如下三個方法:
wait(); // 等待
notify(); // 喚醒乙個
notifyall(); // 喚醒所有
都使用在同步中,因為要對持有監視器(鎖)的執行緒操作。
所以要使用在同步中,因為只有同步才具有鎖。
為什麼這些操作執行緒的方法要定義object類中呢?
因為這些方法在操作同步中線程時,都必須要標識它們所操作執行緒持有的鎖,
只有同乙個鎖上的被等待執行緒,可以被同乙個鎖上notify喚醒。
不可以對不同鎖中的執行緒進行喚醒。
也就是說,等待和喚醒必須是同乙個鎖。
而鎖可以是任意物件,所以可以被任意物件呼叫的方法定義object類中。
解決思路 :我們可以在資源(res)上定義乙個標誌位(flag),並初始化為false,意味著輸入執行緒並未開始進行賦值。當輸入執行緒(input)每次在對資源進行操作前,都會對標誌位進行判斷,如果flase,進行賦值,否則,wait(),失去執行資格。當輸入執行緒 在 一次賦值完成後,把標誌位設定成ture,並喚醒輸出執行緒(output),假設現在輸入執行緒(input)仍舊獲取執行權,但是由於資源的標誌位為true,所以輸入執行緒(input) wait,已經失去執行權。此時,輸出執行緒(output)獲取執行權,同樣的,在輸出資源的時候,判斷資源的標誌位,為ture的時候,輸出,否則wait。當輸出執行緒(output)完成一次輸出後,將標誌位設定成true,並喚醒輸入執行緒。假設輸出執行緒此刻還未失去執行權,繼續走run方法,那麼當判斷標誌位 flag = flase,後輸出執行緒就wait 了。
**如下:
//資源
class
resource
//輸入執行緒
class
input
implements
runnable
public
void run()
else
x = (x+1)%2;
res.flag = true;
res.notify();
}else
catch(exception e)}}
}}
}//輸出執行緒
class
output
implements
runnable
@override
public
void run()
else
catch(exception e)}}
}}
}//主函式
public
class
threadwaitandnotify
}
輸出結果如下(擷取部分):
.....
輸出執行緒:傑克...男
輸出執行緒:jack...man
輸出執行緒:傑克...男
輸出執行緒:jack...man
輸出執行緒:傑克...男
輸出執行緒:jack...man
輸出執行緒:傑克...男
輸出執行緒:jack...man
輸出執行緒:傑克...男
輸出執行緒:jack...man
輸出執行緒:傑克...男
輸出執行緒:jack...man
......
需要demo的請戳這裡
下面繼續優化下**結構:
//資源
class
resource
catch(exception e){}
this.name = name;
this.*** = ***;
flag = true;
this.notify();
}public synchronized void getstring()
catch(exception e){}
system.out.println("輸出執行緒:"+name+"..."+***);
flag = false;
this.notify();
}}//輸入執行緒
class
input
implements
runnable
public
void run()
else
x = (x+1)%2;}}
}//輸出執行緒
class
output
implements
runnable
@override
public
void run()
}}//主函式
public
class
threadwaitandnotify
}
java執行緒間通訊 等待喚醒機制
等待喚醒機制 涉及方法 1 wait 讓執行緒處於凍結狀態,被wait的執行緒會儲存到執行緒池中 2 notify 喚醒執行緒池中任一線程 隨機 3 nitifyall 喚醒執行緒池中所有執行緒 這些方法必須定義在同步中,因為這些方法是用於操作執行緒狀態的方法,必須要明確操作的是哪個鎖上的執行緒 這...
執行緒間通訊 等待喚醒機制
執行緒間通訊 其實就是多個執行緒在操作同乙個資源,但是操作的動作不同 class res2 class input2 implements runnable public void run catch interruptedexception e if x 0 else x x 1 2 r.flag...
java基礎12 執行緒間通訊 等待喚醒機制
今天學習了等待喚醒機制,通過乙個例子做個小小的總結。需求是對某個資料進行修改和輸出操作,要求兩個操作同時進行,且先修改後輸出。設計思路 1,需要乙個公共資料類。兩個執行緒,乙個input 乙個output。2,input和output應該是兩個執行緒,這樣才能同時進行。3,input和output的...