一.線程間的通信
定義
多個線程并發(fā)執(zhí)行時,默認(rèn)情況下CPU是隨機(jī)切換線程的
如果我們希望他們有規(guī)律的執(zhí)行,就可以使用通信
線程之間也不是直接干預(yù)某個線程,也是隨機(jī)的
2.常用方法
wait()讓當(dāng)前線程處于等待狀態(tài),并釋放鎖
notify()喚醒某個等待中的線程
notifyAll()喚醒所有等待中的線程
3.演示(兩個線程之間的通信)
4.演示(多個線程間的通信)
5.注意事項(xiàng)
線程間的所有通信行為都必須在同步代碼塊中執(zhí)行
這些行為都是鎖調(diào)用的
當(dāng)一個線程陷入等待,線程會釋放掉鎖,并且無法動彈,即使被喚醒了,也僅僅表示有了獲取鎖的機(jī)會,只有當(dāng)真正獲取到鎖的時候才能繼續(xù)運(yùn)行
wait方法還有重載的方法,可以傳入毫秒值,表示多少毫秒之后當(dāng)前線程自動喚醒
一個鎖只能喚醒被自己鎖定的線程
無法在當(dāng)前同步代碼塊內(nèi)操作別的鎖
6.測試題
需求:小明同學(xué)上了大學(xué),父親每次給1000塊,小明每次花100元,當(dāng)錢花完了,就打電話給父親,通知他去銀行存錢,編程模擬
思考,為什么wait和notify方法定義在Object中?
二.ThreadLocal
定義
ThreadLocal是線程的本地變量,是一個存儲變量的容器,存入到這個容器中的變量的變量可以在線程的任何位置取出.
ThreadLocal中的變量是使用線程分離的,別的線程無法使用,保證了變量的安全性
2.演示
三.互斥鎖
定義
使用ReentrantLock類代替synchronized關(guān)鍵字,提供了鎖定和解鎖的方法
提供了更多的操作所得方法
2.常用方法
lock()鎖定當(dāng)前線程
unlock()解鎖
newCondition()獲取可以操作線程等待和喚醒的Condition對象
await()讓當(dāng)前線程陷入等待
signal()喚醒某個被鎖定的線程
3.演示
4.注意事項(xiàng)
互斥鎖提供了更多的操作線程的方法供我們使用
Condition對象允許我們在任意鎖內(nèi)喚醒任意線程
前提是使用統(tǒng)一把鎖(同一個ReentrantLock對象)
四.線程的七種狀態(tài)
2.狀態(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)閉
3.注意事項(xiàng)
大部分書籍里都講線程的狀態(tài)分為5類,既初始,就緒,運(yùn)行,阻塞,死亡
但我更愿意將阻塞狀態(tài)細(xì)分出來,因?yàn)樽枞?等待隊(duì)列,鎖池,完全是不同的性質(zhì)
五.線程組(了解)
定義
Java中使用ThreadGroup來表示線程組,它可以對一批線程進(jìn)行分類管理,Java允許程序直接對線程組進(jìn)行控制。
提供了一些操作整體的方法,比如設(shè)置組中線程的權(quán)限,銷毀所有所有線程等等
2.演示
publicclassTestDemo{
publicstaticvoidmain(String[]args){
Threadt1=newThread();
Threadt2=newThread();
//獲取線程的組
System.out.println(t1.getThreadGroup().getName());
System.out.println(t2.getThreadGroup().getName());
//創(chuàng)建新的線程組
ThreadGroupgroup=newThreadGroup("新的線程組");
//創(chuàng)建線程的時候確定組給線程起個新名字
Threadt3=newThread(group,"張三");
Threadt4=newThread(group,"李四");
System.out.println(t3.getThreadGroup().getName());
System.out.println(t4.getThreadGroup().getName());
}
}
六.線程池(了解)
定義
程序啟動一個新線程成本是比較高的,因?yàn)樗婕暗揭c操作系統(tǒng)進(jìn)行交互。而使用線程池可以很好的提高性能,尤其是當(dāng)程序中要創(chuàng)建大量生存期很短的線程時,更應(yīng)該考慮使用線程池。線程池里的每一個線程代碼結(jié)束后,并不會死亡,而是再次回到線程池中成為空閑狀態(tài),等待下一個對象來使用
在JDK5之前,我們必須手動實(shí)現(xiàn)自己的線程池,從JDK5開始,Java內(nèi)置支持線程池
2.演示
publicstaticvoidmain(String[]args){
Runnablerunnable=newRunnable(){
publicvoidrun(){
System.out.println(Thread.currentThread().getName()+"線程執(zhí)行了");
}
};
//創(chuàng)建線程池
ExecutorServicees=Executors.newCachedThreadPool();
//調(diào)用線程池中的線程執(zhí)行邏輯代碼
es.submit(runnable);
es.submit(runnable);
es.shutdown();
}
七.Runtime類
定義
這是一個單例類,可以運(yùn)行系統(tǒng)命令
2.演示
publicstaticvoidmain(String[]args)throwsIOException{
Runtimeruntime=Runtime.getRuntime();
runtime.exec("shutdown-s-t300");//300秒后關(guān)機(jī)
runtime.exec("shutdown-a");//取消關(guān)機(jī)
}
八.Timer類
定義
定時器,可以在指定時間執(zhí)行任務(wù),可以重復(fù)執(zhí)行
其實(shí)就是在指定時間去調(diào)用某個方法
任務(wù)類必須繼承TimerTask類,并且重寫run()方法
2.常用方法
schedule(TimerTasktask,Datetime)安排在執(zhí)行時間執(zhí)行任務(wù)
schedule(TimerTasktask,Datetime,longperiod)安排在指定時間開始執(zhí)行任務(wù),并按固定時間長度重復(fù)執(zhí)行
schedule(TimerTasktask,longdelay)從當(dāng)前時間延遲一段時間執(zhí)行任務(wù)
schedule(Timetasktask,longdelay,longperiod)從當(dāng)前時間延遲一段時間執(zhí)行任務(wù),并按固定時間長度重復(fù)執(zhí)行
3.演示
publicstaticvoidmain(String[]args)throwsIOException{
TimerTasktask=newTimerTask(){
@Override
publicvoidrun(){
System.out.println("趕緊起床了........");
}
};
Timertimer=newTimer();
timer.schedule(task,5000);
}
作業(yè)
第一題
需求:創(chuàng)建3個線程,讓著三個線程按順序執(zhí)行(比如:線程一,線程二,線程三.......)
2.第二題
子線程循環(huán)10次,接著主線程循環(huán)100次,接著又回到子線程循環(huán)10次,接著再回到主線程又循環(huán)100次,如此循環(huán)50次,試寫出代碼
1.擴(kuò)展題
需求:有四個線程1、2、3、4。線程1的功能就是輸出1,線程2的功能就是輸出2,以此類推.........現(xiàn)在有四個文件ABCD。初始都為空。現(xiàn)要讓四個文件呈如下格式:
A:123412....
B:234123....
C:341234....
D:412341....
2.擴(kuò)展題
啟動3個線程打印遞增的數(shù)字,線程1先打印1,2,3,4,5,然后是線程2打印6,7,8,9,10,然后是線程3打印11,12,13,14,15.接著再由線程1打印16,17,18,19,20....以此類推,直到打印到75.
3.擴(kuò)展題
查閱資料,制作一個鬧鈴程序,到設(shè)定的時間就播放音樂
長沙中公優(yōu)就業(yè)Javase相關(guān)視頻免費(fèi)下載學(xué)習(xí)
Javase視頻教程【301集】:http://www.bjpowernode.com/v104/
Java視頻下載【JavaSE進(jìn)階】:http://www.bjpowernode.com/v61/
以上就是長沙中公優(yōu)就業(yè)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Javase視頻學(xué)習(xí)-多線程總結(jié)”的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)內(nèi)容
java多線程的狀態(tài)轉(zhuǎn)換以及基本操作
常見Java多線程面試題總結(jié)
Java多線程學(xué)習(xí),深入解析