昨天看了乙個三線程迴圈列印abc的經典例子,看了很多部落格感覺都沒有講清楚具體的執行流程,而且對於方法的解釋也是沒有完全沒有解釋好,和朋友討論解決了這個問題,寫下這篇部落格,來解釋三線程同步列印的問題,所以不能完全相信部落格的解釋,最好還是看官方的注釋和原始碼。
public
class
hjsjythread
implements
runnable
@override
public
void
run(
)catch
(interruptedexception e)
self.
notify()
;}trycatch
(interruptedexception e)}}
}public
static
void
main
(string[
] args)
throws exception
}//輸出:abcabcabcabcabcabcabcabcabcabc
wakes up a single thread that is waiting on this object』s monitor.
if any thread are waiting on this object ,one of them is chosen to be awakened.
這段英文還是挺簡單的 喚醒任意乙個正在等待當前物件的waiting執行緒,重點就是在這個正在等待當前物件這句話,這是第乙個作用,另外notify()並不是立刻釋放物件鎖,而是要等出臨界區 也就是在這個例子裡面的內synchronized。出去之後執行緒才會釋放物件鎖
主線程開啟,執行a執行緒,獲得 c, a鎖, 輸出a count為9,這時self.notify()也就是a.notify(),當前沒有正在等待a物件鎖的wait 執行緒所以只有釋放鎖的作用,接著執行 c.wait() ,釋放c鎖,並且讓當前執行緒也就是a執行緒等待,接著執行b執行緒 b執行緒等待a鎖的釋放(因為notify()不是立刻釋放鎖的,具體可以看上面notify 方法的解釋),得到a ,b鎖之後輸出b count=9,執行b.notify(),也沒有當前wait 等待b鎖的wait執行緒 所以也有釋放鎖的功能,接著a.wait,b執行緒d等待 立刻釋放鎖a,接著執行c執行緒,需要等待b執行緒釋放b鎖,得到b c鎖執行,輸出c然後count=9,然後c.notify() 當前有正在等待c的wait執行緒 也就是a執行緒,c執行緒執行b.wait 讓c執行緒d等待並且立刻釋放b鎖,a需要等待c執行緒釋放c鎖 如此迴圈列印。
三線程併發 依次打出A B C
class deadlock implements runnable static string tag a string tmptag public int flag 1 string ch static object o1 new object o2 new object public void...
三個執行緒ABC,交替列印ABC
問題為三線程間的同步喚醒操作,主要的目的就是threada threadb threadc threada 迴圈執行三個執行緒。為了控制線程執行的順序,那麼就必須要確定喚醒 等待的順序,所以每乙個執行緒必須同時持有兩個物件鎖,才能繼續執行。乙個物件鎖是prev,就是前乙個執行緒所持有的物件鎖。還有乙...
Java執行緒鎖 二 迴圈列印ABC
1 經典例子 對object.wait object.notify 的應用最經典的例子,應該是三線程列印abc的問題了吧,這是一道比較經典的面試題 網上關於本面試題很多 題目要求如下 建立三個執行緒,a執行緒列印10次a,b執行緒列印10次b,c執行緒列印10次c,要求執行緒同時執行,交替列印10次...