線程模式:Leader-Follower
來自專欄 Java之鏈
線程基礎:
1:Java 中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程)。守護線程依賴非守護線程的存在,比如垃圾回收現場。如果用戶線程結束,守護線程也會退出。
2:線程的狀態:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED
思考一下BLOCKED和WAITING有什麼區別?怎麼實現?
3:sleep和wait有什麼區別?
1)這兩個方法來自不同的類分別是Thread和Object
2)最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖
3)wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何
地方使用
4)sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
注意:上圖中Java線程沒有Running這個狀態,可執行和執行中都屬於Runnable
(1)線程有3種狀態:領導leading,處理processing,追隨following
(2)假設共N個線程,其中只有1個leading線程(等待任務),x個processing線程(處理),餘下有N-1-x個following線程(空閑)
(3)有一把鎖,誰搶到就是leading,它的任務是等待新任務。
(4)事件/任務來到時,leading線程會對其進行處理,從而轉化為processing狀態,處理完成之後,又轉變為following
(5)丟失leading後,following會嘗試搶鎖,搶到則變為leading,否則保持following
(6)following不干事,就是搶鎖,力圖成為leading
在延遲隊列DelayQueue中可以看這種線程模式。這種隊列常見用於以下問題:
a) 關閉空閑連接。伺服器中,有很多客戶端的連接,空閑一段時間之後需要關閉之。
b) 緩存。緩存中的對象,超過了空閑時間,需要從緩存中移出。
c) 任務超時處理。在網路協議滑動窗口請求應答式交互時,處理超時未響應的請求。
推薦閱讀:
※Condition
※CyclicBarrier
※性能測試之並發壓力
※semaphore
TAG:並發 |