1.創(chuàng)建線程的三種方式:
1.1 繼承Thread
1.2 實(shí)現(xiàn)Runnable接口
1.3 實(shí)現(xiàn)FutureTask<T> 包裝Callable接口 (區(qū)別于run執(zhí)行方法贯莺,call可帶返回值)
優(yōu)缺點(diǎn):
繼承Thread類方式優(yōu)點(diǎn)就是獲取當(dāng)前線程比較方便 缺點(diǎn)就是不能繼承其他類
實(shí)現(xiàn)runnable 或者 callable? 可以多個(gè)線程共享同一個(gè)target,并且可以繼承其他類
2.線程的生命周期
2.1 新建:實(shí)例化線程類晨雳,線程就處于新建狀態(tài)轻姿,此時(shí)分配內(nèi)存并初始化吕世。
2.2 就緒: 調(diào)用線程的start方法后艺演,此時(shí)線程處于就緒狀態(tài)实牡,虛擬機(jī)創(chuàng)建方法調(diào)用棧和程序計(jì)數(shù)器斋荞。此時(shí)線程也并沒(méi)有運(yùn)行荞雏,是否運(yùn)行取決于線程調(diào)度器的調(diào)度
2.3 運(yùn)行:獲得cpu資源,并執(zhí)行線程執(zhí)行體run方法平酿。
2.4 阻塞:
搶占式策略:以線程可占時(shí)間段來(lái)暫用cpu資源凤优,不斷輪切線程進(jìn)行執(zhí)行。
協(xié)作式策略: 只有當(dāng)主動(dòng)調(diào)用線程的sleep或yield方法 才會(huì)放棄占用的資源蜈彼。
被阻塞幾種情況:
1.sleep等方法的調(diào)用筑辨,主動(dòng)放棄資源,此時(shí)線程進(jìn)入阻塞狀態(tài)
2.調(diào)用了阻塞式的IO方法
3.同步監(jiān)聽器被其他線程所持有幸逆。 這個(gè)也是線程安全的集合為什么性能會(huì)差于線程不安全的
4.等待notify
5.調(diào)用suspend掛起棍辕。
2.5:死亡
3.sleep和yield區(qū)別?
都是讓當(dāng)前線程執(zhí)行。不同點(diǎn):sleep 阻塞線程还绘,yield 暫停線程重置為就緒狀態(tài)楚昭。
yield調(diào)用后,cpu很可能再暫停后立馬又運(yùn)行該線程蚕甥。由當(dāng)前就緒狀態(tài)的線程數(shù)和優(yōu)先級(jí)來(lái)決定哪替。
4.同步監(jiān)視器
多線程下,對(duì)可變類進(jìn)行修改容易引起數(shù)據(jù)不安全菇怀,所以通過(guò)同步監(jiān)視器進(jìn)行同步工作凭舶,也就是線程安全。兩種方式爱沟。
1.在執(zhí)行修改共享數(shù)據(jù)得方法體內(nèi) 用synchronized關(guān)鍵字包裹帅霜,并且鎖對(duì)象是可變類得對(duì)象,
2.用synchronized關(guān)鍵字修飾可變類得方法呼伸。當(dāng)前鎖定得對(duì)象也是調(diào)用方法得對(duì)象身冀。
5.線程通信三種方式
5.1 傳統(tǒng)通信方式: synchronized 同步代碼塊和方法 + wait+notify +notifyAll
5.2 Condition控制:Lock 實(shí)例得Condition實(shí)例 +condition.await +?condition.signal +condition.signalAll
5.3 BlockingQueue 阻塞隊(duì)列:put 和 take 隊(duì)列滿,或者隊(duì)列空會(huì)阻塞線程