執行緒交替列印

2021-07-23 05:55:50 字數 2476 閱讀 4835

/**

* 建立三個執行緒,a執行緒列印10次a,b執行緒列印10次b,c執行緒列印10次c,要求執行緒同時執行,交替列印10次abc。

* 這個問題用object的wait(),notify()就可以很方便的解決。

* * 主要的思想就是,為了控制執行的順序,必須要先持有prev鎖,也就前乙個執行緒要釋放自身物件鎖,再去申請自身物件鎖,

* 兩者兼備時列印,之後首先呼叫self.notify()釋放自身物件鎖,喚醒下乙個等待執行緒,再呼叫prev.wait()釋放prev物件鎖,

* 終止當前執行緒,等待迴圈結束後再次被喚醒。

* * 程式執行的主要過程就是a執行緒最先執行,持有c,a物件鎖,後釋放a,c鎖,喚醒b。執行緒b等待a鎖,再申請b鎖,後列印b,

* 再釋放b,a鎖,喚醒c,執行緒c等待b鎖,再申請c鎖,後列印c,再釋放c,b鎖,喚醒a。

* * wait導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 要領或 notifyall() 要領。當前的執行緒必須擁有此物件監視器。該執行緒揭曉對此監視器的一切權並等待,直到其他執行緒議決呼叫 notify 要領,或 notifyall 要領告訴在此物件的監視器上等待的執行緒醒來。然後該執行緒將等到重新獲得 對監視器的一切權後才能繼續執行.

notify喚醒在此物件監視器上等待的單個執行緒。假如一切執行緒都在此物件上等待,則會挑選喚醒其中乙個執行緒。直到當前的執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。此要領只應由作為此物件監視器的一切者的執行緒來呼叫.

"當前的執行緒必須擁有此物件監視器"與"此要領只應由作為此物件監視器的一切者的執行緒來呼叫"表明 wait要領與notify要領必須在同步塊內執行,即synchronized(obj之內).

呼叫對像wait要領後,當火線程釋放對像鎖,進入等待形狀 .直到其他執行緒(也只好是其他執行緒)議決 notify 要領,或 notifyall.該執行緒重新獲得 對像鎖.

繼續執行,記得執行緒必須重新獲得 對像鎖才能繼續執行.由於 synchronized**塊內沒有鎖是寸步無法走的.

notify()和notifyall()都是object物件用於通知處在等待該物件的執行緒的方法。兩者的最大區別在於:

notifyall使所有原來在該物件上等待被notify的執行緒統統退出wait的狀態,變成等待該物件上的鎖,一旦該物件被解鎖,他們就會去競爭。

notify則文明得多他只是選擇乙個wait狀態執行緒進行通知,並使它獲得該物件上的鎖,但不驚動其他同樣在等待被該物件notify的執行緒們,當第乙個執行緒執行完畢以後釋放物件上的鎖此時如果該物件沒有再次使用notify語句,則即便該物件已經空閒,其他wait狀態等待的執行緒由於沒有得到該物件的通知,繼續處在wait狀態,直到這個物件發出乙個notify或notifyall,它們等待的是被notify或notifyall,而不是鎖。

*/package t;

public class mythreadprinter2 implements runnable   

@override  

public void run()

catch (interruptedexception e)*/

self.notify(); //喚醒在此物件監視器上等待的單個執行緒(即等待給self加鎖的執行緒)。假如多個執行緒都在此物件上等待,則會挑選喚醒其中乙個執行緒。

}//self解鎖,被喚醒的執行緒此時可以給self加鎖了。   

try catch (interruptedexception e)   

}   

}   

}   

public static void main(string args) throws exception 同步塊結束),c.wait()->該執行緒pa等待(c暫時解鎖,直至其它執行緒執行c.notify()之後,該執行緒pa才能繼續執行(即被喚醒)---可以理解為等待c的通知)

thread.sleep(10);//在單執行緒下,thread.sleep(10000)讓你的執行緒「睡眠」10000ms,也就是不工作,因為是單執行緒,所以要等到過了10000ms之後,該子執行緒繼續工作。

//多執行緒下,睡眠的執行緒main先不工作,讓其餘的子執行緒先工作,等過了10000ms之後,它再重新回到執行緒的等待隊伍中,開始工作。

//main睡眠10ms結束後,執行下面的語句,即new thread(pb).start();----pb執行緒啟動後,main再睡眠10ms,接著啟動pc。這樣不讓pb和pc相鄰啟動,避免pc和pb競爭(因為開始時pc和pb都符合條件)

new thread(pb).start();//a b加鎖,b輸出'b',b喚醒pc,b解鎖,a.wait()->該執行緒pb等待(c暫時解鎖,直至其它執行緒執行a.notify()之後,該執行緒pb才能繼續執行)

thread.sleep(10);

new thread(pc).start();//b c加鎖,c輸出'c',c喚醒pa,c解鎖,b.wait()->該執行緒pc等待(b暫時解鎖,直至其它執行緒執行b.notify()之後,該執行緒pc才能繼續執行)

thread.sleep(10);

}   

}  

執行緒按順序交替列印

乙個經典的面試題目 編寫乙個程式,開啟3個執行緒。這3個執行緒的id分別為a b c.每個執行緒將自己的id在螢幕上列印10遍。要求輸出的結果必須按順序顯示,如 abcabcabcabcab.public class copyoftestconditioneffect a start new thr...

併發程式設計 執行緒交替列印

目錄 一.題目 二.我們提供乙個類 class foobar public void bar 兩個不同的執行緒將會共用乙個 foobar 例項。其中乙個執行緒將會呼叫 foo 方法,另乙個執行緒將會呼叫 bar 方法。請設計修改程式,以確保 foobar 被輸出 n 次。示例 1 輸入 n 1 輸出...

多執行緒 LeetCode 交替列印FooBar

我們提供乙個類 class foobar public void bar 兩個不同的執行緒將會共用乙個 foobar 例項。其中乙個執行緒將會呼叫 foo 方法,另乙個執行緒將會呼叫 bar 方法。請設計修改程式,以確保 foobar 被輸出 n 次。示例 1 輸入 n 1 輸出 foobar 解釋...