三個執行緒ABC,交替列印ABC

2021-07-30 09:40:57 字數 1805 閱讀 2271

問題為三線程間的同步喚醒操作,主要的目的就是threada->threadb->threadc→threada……迴圈執行三個執行緒。為了控制線程執行的順序,那麼就必須要確定喚醒、等待的順序,所以每乙個執行緒必須同時持有兩個物件鎖,才能繼續執行。乙個物件鎖是prev,就是前乙個執行緒所持有的物件鎖。還有乙個就是自身物件鎖。

主要的思想就是,為了控制執行的順序,必須要先持有prev鎖,也就是前乙個執行緒要釋放自身物件鎖,再去申請自身物件鎖,兩者兼備時列印字母,之後首先呼叫self.notifyall()釋放自身物件鎖,喚醒下乙個等待執行緒,再呼叫prev.wait()釋放prev物件鎖,終止當前執行緒,等待迴圈結束後再次被喚醒。程式執行的主要過程就是a執行緒最先執行,持有c,a物件鎖,後釋放a,c鎖,喚醒b。執行緒b等待a鎖,再申請b鎖,後列印b,再釋放b,a鎖,喚醒c,執行緒c等待b鎖,再申請c鎖,後列印c,再釋放c,b鎖,喚醒a……

為了避免jvm啟動threada、threadb、threadc三個執行緒順序的不確定性。需要讓a,b,c三個執行緒以確定的順序啟動,中間加一段sleep確保前乙個執行緒已啟動。

public class abc 

@override

public void run()

try 語句塊執行結束,自動釋放鎖,

* jvm會在wait()物件鎖的執行緒中隨機選取一線程,賦予其物件鎖,喚醒執行緒,繼續執行。

*/} catch (interruptedexception e) }}

}}

public static void main(string args) throws exception

}

public class abc_lock 

} finally }}

}static class threadb extends thread

} finally }}

}static class threadc extends thread

} finally }}

}public static void main(string args)

}

public class abc_condition 

} catch (interruptedexception e) finally }}

static class threadb extends thread

} catch (interruptedexception e) finally }}

static class threadc extends thread

} catch (interruptedexception e) finally }}

public static void main(string args) throws interruptedexception

}

public class abc_semaphore 

} catch (interruptedexception e) }}

static class threadb extends thread

} catch (interruptedexception e) }}

static class threadc extends thread

} catch (interruptedexception e) }}

public static void main(string args) throws interruptedexception

}

三個執行緒交替列印ABC 最優演算法

看了很多關於執行緒交替列印abc的,千奇百怪,有用鎖的,也有用原子操作的,還有用巢狀同步 塊的,實在是很沒有必要,演算法題追求的是簡短精煉,思想昇華。演算法題就是活到老學到老啦,下面就給大家介紹乙個最好的演算法思路。仔細看哦,不難理解。1.volatile關鍵字 多執行緒操作同乙個變數的時候,首先獲...

三個執行緒交替順序列印ABC

建立三個執行緒a b c,a執行緒列印10次字母a,b執行緒列印10次字母b,c執行緒列印10次字母c,但是要求三個執行緒同時執行,並且實現交替列印,即按照abcabcabc的順序列印。解決辦法 使用synchronized,wait和notifyall 思路 使用同步塊和wait notify的方...

建立三個執行緒,分別列印 a,b,c

建立三個執行緒,分別列印 a,b,c.現在要求用訊號量對執行緒進行同步,無論程式執行 多少次 如何執行,都能使整個程式依次列印 a b c a b c a b c 一直死迴圈 include include include include include include include includ...