參考文獻(xiàn):《Java瘋狂講義》(第三版)
run()方法:方法體即線程執(zhí)行體
線程Target
執(zhí)行體:run或call方法
call()方法:可以用get()來獲取返回值
線程生命周期:
1、new;新建
2、runnable;就緒
3、running;運(yùn)行
4、blocked;阻塞
可以用sleep方法或者suspend方法進(jìn)入阻塞狀態(tài)
5、dead;死亡
新建——>就緒——>運(yùn)行——>死亡
新建通過start方法進(jìn)入就緒狀態(tài);
運(yùn)行通過阻塞回到就緒狀態(tài);
通過以下情形進(jìn)入阻塞:
1、sleep或suspend
2、IO阻塞
3、等到同步鎖、等待通知
運(yùn)行時(shí)通過stop方法或者run方法、call方法執(zhí)行體完成進(jìn)入死亡狀態(tài)
或捕捉到error或異常;
所有現(xiàn)代的桌面和服務(wù)器操作系統(tǒng)都采用了搶占式調(diào)度策略
join方法(插隊(duì)):讓某線程等待調(diào)用join方法的線程
后臺(tái)線程:為其他線程提供服務(wù)
setDaemon(true)成為后臺(tái)線程
特征:
1、前臺(tái)線程都死亡,后臺(tái)線程自動(dòng)死亡;
例:JVM垃圾回收線程
注意:setDaemon必須放在start方法前調(diào)用
線程讓步:yield()方法
某線程調(diào)用yield 方法后:you優(yōu)先級(jí)比當(dāng)前線程更高的處于就緒狀態(tài)的線程,才會(huì)獲得執(zhí)行機(jī)會(huì)
sleep方法與yield方法的區(qū)別:
1、sleep暫停后,會(huì)給其他線程機(jī)會(huì);yield方法只會(huì)給優(yōu)先級(jí)相同或更高的線程機(jī)會(huì);
2、阻塞狀態(tài)sleep
就緒狀態(tài)yield
3、yield無捕捉異常
4、sleep方法具有更高的可移植性
改變線程優(yōu)先級(jí)
默認(rèn)與創(chuàng)建它的父線程優(yōu)先級(jí)相同
線程同步:
線程安全問題:
邏輯:加鎖——>修改——>釋放所
synchronized關(guān)鍵字
使用synchronized關(guān)鍵字修飾方法令該方法成為同步方法
或synchronized(obj){...}
線程通信
wait方法等待
notify方法喚醒
notifyAll方法喚醒所有
由同步監(jiān)視器對(duì)象調(diào)用
Condition控制線程通信
接口BlockingQueue控制線程通信:兩個(gè)線程通過交替向BlockingQueue中放入元素、取出元素
即可很好地控制線程的通信
線程組ThreadGroup來表示線程組,它可以對(duì)一批線程進(jìn)行分類管理,Java允許程序直接對(duì)線程組進(jìn)行控制
線程池
1、池的概念
2、線程池可以有效地控制系統(tǒng)中并發(fā)線程的數(shù)量
相關(guān)類
ThreadLocal類,它代表一個(gè)線程局部變量,通過把數(shù)據(jù)放在ThreadLocal中就可以讓每個(gè)線程創(chuàng)建一個(gè)該變量的副本
線程安全集合類
以Concurrent開頭的集合類代表了支持并發(fā)訪問的集合,它們支持多個(gè)線程并發(fā)寫入訪問,這些寫入訪問的操作都是安全的