線程基礎(chǔ):
1:Java 中有兩類線程:User Thread(用戶線程)泣棋、Daemon Thread(守護(hù)線程)把敢。守護(hù)線程依賴非守護(hù)線程的存在,比如垃圾回收現(xiàn)場。如果用戶線程結(jié)束慨飘,守護(hù)線程也會退出。
2:線程的狀態(tài):NEW译荞,RUNNABLE瓤的,BLOCKED,WAITING吞歼,TIMED_WAITING圈膏,TERMINATED
3:sleep和wait有什么區(qū)別?
1)這兩個(gè)方法來自不同的類分別是Thread和Object
2)最主要是sleep方法沒有釋放鎖篙骡,而wait方法釋放了鎖
3)wait稽坤,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep
可以在任何地方使用
4)sleep必須捕獲異常糯俗,而wait尿褪,notify和notifyAll不需要捕獲異常
注意:上圖中Java線程沒有Running這個(gè)狀態(tài),可執(zhí)行和執(zhí)行中都屬于Runnable
(1)線程有3種狀態(tài):領(lǐng)導(dǎo)leading得湘,處理processing杖玲,追隨following
(2)假設(shè)共N個(gè)線程,其中只有1個(gè)leading線程(等待任務(wù))忽刽,x個(gè)processing線程(處理)天揖,余下有N-1-x個(gè)following線程(空閑)
(3)有一把鎖夺欲,誰搶到就是leading跪帝,它的任務(wù)是等待新任務(wù)今膊。
(4)事件/任務(wù)來到時(shí),leading線程會對其進(jìn)行處理伞剑,從而轉(zhuǎn)化為processing狀態(tài)斑唬,處理完成之后,又轉(zhuǎn)變?yōu)閒ollowing
(5)丟失leading后黎泣,following會嘗試搶鎖恕刘,搶到則變?yōu)閘eading,否則保持following
(6)following不干事抒倚,就是搶鎖褐着,力圖成為leading
在延遲隊(duì)列DelayQueue中可以看這種線程模式。這種隊(duì)列常見用于以下問題:
a) 關(guān)閉空閑連接托呕。服務(wù)器中含蓉,有很多客戶端的連接,空閑一段時(shí)間之后需要關(guān)閉之项郊。
b) 緩存馅扣。緩存中的對象,超過了空閑時(shí)間着降,需要從緩存中移出差油。
c) 任務(wù)超時(shí)處理。在網(wǎng)絡(luò)協(xié)議滑動窗口請求應(yīng)答式交互時(shí)任洞,處理超時(shí)未響應(yīng)的請求蓄喇。
2019-07-19
關(guān)于線程的狀態(tài)(state),我做了一些測試
Thread.sleep : TIMED_WAITING
join(long millis) : TIMED_WAITING
ReentrantLock : WAITING
join: WAITING
synchronized: BLOCKED
更加詳細(xì)見下圖: