一、線程之間的通信
定義:
多個(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í)行