高級多線程

一、線程之間的通信

定義:

多個(gè)線程并發(fā)執(zhí)行時(shí),默認(rèn)情況下是隨機(jī)切換線程的

如果我們希望它們有規(guī)律的執(zhí)行,就可以使用通信

線程之間也不是隨機(jī)干預(yù)線程也是隨機(jī)的

常用方法

wait()讓當(dāng)前線程處于等待狀態(tài),并釋放鎖

notify()喚醒某個(gè)等待中的線程

notifyAll()喚醒所有等待中的線程

注意事項(xiàng)

線程間的所有通信行為都必須在同步代碼塊中執(zhí)行

這些行為都是鎖調(diào)用的

當(dāng)一個(gè)線程陷入等待, 線程會(huì)釋放掉鎖, 并且無法動(dòng)彈, 即使被喚醒了, 也僅僅表示有了獲取鎖的機(jī)會(huì), 只有當(dāng)真正獲取到鎖的時(shí)候才能繼續(xù)運(yùn)行

wait方法還有重載的方法,可以傳入毫秒值,表示多少毫秒之后當(dāng)前線程自動(dòng)喚醒

一個(gè)鎖只能喚醒被自己鎖定的線程

無法在當(dāng)前同步代碼塊內(nèi)操作別的鎖

ThreadLocal

ThreadLocalsshi線程的本地變量,是一個(gè)存儲(chǔ)變量的容器,存入到這個(gè)容器中的變量可以在線程的任意位置取出

ThreadLocal.中的變量是使用線程分離的,別的線程無法使用,保證了線程的安全性

互斥鎖

定義

使用ReentrantLock類代替synchronized關(guān)鍵字, 提供了鎖定和解鎖的方法

提供了更多的操作所得方法

常用方法

lock() 鎖定當(dāng)前線程

unlock() 解鎖

newCondition() 獲取可以操作線程等待和喚醒的Condition對象

await() 讓當(dāng)前線程陷入等待

signal() 喚醒某個(gè)被鎖定的線程

線程的七種狀態(tài)

初始狀態(tài):線程創(chuàng)建完成

就緒狀態(tài):線程可以被執(zhí)行

運(yùn)行狀態(tài):線程正在運(yùn)行中

阻塞狀態(tài):線程被休眠

等待隊(duì)列:線程陷入無限的等待

鎖池狀態(tài):線程被喚醒,但是沒有獲取到鎖

死亡狀態(tài):線程執(zhí)行完畢,被關(guān)閉

注意事項(xiàng)

大部分書籍里都講線程的狀態(tài)分為5類, 既初始, 就緒, 運(yùn)行, 阻塞, 死亡

但我們更愿意將阻塞狀態(tài)細(xì)分出來, 因?yàn)?阻塞, 等待隊(duì)列, 鎖池, 完全是不同的性質(zhì)

線程組

java中使用ThreadGroup來表示線程組,它可以對一批線程進(jìn)行分類管理,java允許程序直接對線程進(jìn)行控制

提供了一些整體的方法,比如設(shè)置線程中的權(quán)限,銷毀所有的線程等等。

線程池

程序啟動(dòng)一個(gè)新線程成本是比較高的,因?yàn)樗婕暗揭c操作系統(tǒng)進(jìn)行交互。而使用線程池可以很好的提高性能,尤其是當(dāng)程序中要?jiǎng)?chuàng)建大量生存期很短的線程時(shí),更應(yīng)該考慮使用線程池。線程池里的每一個(gè)線程代碼結(jié)束后,并不會(huì)死亡,而是再次回到線程池中成為空閑狀態(tài),等待下一個(gè)對象來使用

在JDK5之前,我們必須手動(dòng)實(shí)現(xiàn)自己的線程池,從JDK5開始,Java內(nèi)置支持線程池

Runtime類

定義

這是一個(gè)單例類, 可以運(yùn)行系統(tǒng)命令

public static void main(String[] args) throws IOException {

Runtime runtime = Runtime.getRuntime();

runtime.exec("shutdown -s -t 300");//300秒后關(guān)機(jī)

runtime.exec("shutdown -a"); //取消關(guān)機(jī)

}

Timer類

定義

定時(shí)器, 可以在指定時(shí)間執(zhí)行任務(wù), 可以重復(fù)執(zhí)行

其實(shí)就是在指定時(shí)間去調(diào)用某個(gè)方法

任務(wù)類必須繼承TimerTask類,并且重寫run()方法

常用方法

schedule(TimerTask task,Date time )? 安排在執(zhí)行時(shí)間執(zhí)行任務(wù)

schedule(TimerTask task,Date time , long period) 安排在指定時(shí)間開始執(zhí)行任務(wù), 并按固定時(shí)間長度重復(fù)執(zhí)行

schedule(TimerTask task, long delay) 從當(dāng)前時(shí)間延遲一段時(shí)間執(zhí)行任務(wù)

schedule(TimeTask task,long delay,long period) 從當(dāng)前時(shí)間延遲一段時(shí)間執(zhí)行任務(wù),并按固定時(shí)間長度重復(fù)執(zhí)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容