問題為三線程間的同步喚醒操作,主要的目的就是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...