From:Java并發(fā)編程的藝術(shù)
- 目錄
BiBi - 并發(fā)編程 -0- 開(kāi)篇
BiBi - 并發(fā)編程 -1- 挑戰(zhàn)
BiBi - 并發(fā)編程 -2- volatile
BiBi - 并發(fā)編程 -3- 鎖
BiBi - 并發(fā)編程 -4- 原子操作
BiBi - 并發(fā)編程 -5- Java內(nèi)存模型
BiBi - 并發(fā)編程 -6- final關(guān)鍵字
BiBi - 并發(fā)編程 -7- DCL
BiBi - 并發(fā)編程 -8- 線(xiàn)程
BiBi - 并發(fā)編程 -9- ReentrantLock
BiBi - 并發(fā)編程 -10- 隊(duì)列同步器
BiBi - 并發(fā)編程 -11- 并發(fā)容器
BiBi - 并發(fā)編程 -12- Fork/Join框架
BiBi - 并發(fā)編程 -13- 并發(fā)工具類(lèi)
BiBi - 并發(fā)編程 -14- 線(xiàn)程池
BiBi - 并發(fā)編程 -15- Executor框架
啟動(dòng)一個(gè)普通的Java程序所開(kāi)啟的線(xiàn)程
1)main線(xiàn)程,程序入口
2)Reference Handler - 清除引用的線(xiàn)程
3)Finalizer - 調(diào)用對(duì)象finalize方法的線(xiàn)程
4)Signal Dispatcher - 分發(fā)處理發(fā)送給JVM信號(hào)的線(xiàn)程
finalize()方法
finalize()方法 - 當(dāng)對(duì)象覆蓋finalize方法,并且還沒(méi)有執(zhí)行過(guò),則會(huì)將其放入到F-Queue隊(duì)列中,由一個(gè)低優(yōu)先級(jí)線(xiàn)程執(zhí)行該隊(duì)列中對(duì)象的finalize方法調(diào)用,之后再由GC回收。可以在finalize()方法中對(duì)對(duì)象進(jìn)行【復(fù)活】。
線(xiàn)程優(yōu)先級(jí)的設(shè)置
設(shè)置線(xiàn)程優(yōu)先級(jí)時(shí),針對(duì)頻繁阻塞【休眠或者I/O操作】的線(xiàn)程需要設(shè)置較高優(yōu)先級(jí);而針對(duì)偏重計(jì)算【需要較多CPU時(shí)間或者偏運(yùn)算】的線(xiàn)程則設(shè)置較低的優(yōu)先級(jí),確保處理器不會(huì)被獨(dú)占。即:需要I/O操作的優(yōu)先級(jí)高,需要CPU運(yùn)算的優(yōu)先級(jí)低。
提示:線(xiàn)程的優(yōu)先級(jí)不能作為程序正確性的依賴(lài),因?yàn)椴煌腏VM以及不同的操作系統(tǒng)上都會(huì)有差異。有的操作系統(tǒng)甚至忽略線(xiàn)程優(yōu)先級(jí)的設(shè)定。
Daemon線(xiàn)程
1)主要被用作程序中的后臺(tái)調(diào)度。
2)當(dāng)Java虛擬機(jī)中不存在非Daemon線(xiàn)程時(shí),會(huì)自動(dòng)終止所有Daemon線(xiàn)程。
3)Daemon線(xiàn)程中的finally塊不一定會(huì)執(zhí)行。
4) Daemon線(xiàn)程中開(kāi)啟的線(xiàn)程也是Daemon線(xiàn)程。因?yàn)椋寒?dāng)前線(xiàn)程就是該線(xiàn)程的父線(xiàn)程,而該線(xiàn)程的daemon屬性和priority屬性默認(rèn)為父線(xiàn)程的對(duì)應(yīng)屬性。
一個(gè)線(xiàn)程對(duì)象是由其parent線(xiàn)程進(jìn)行空間分配,并且child線(xiàn)程繼承了parent的daemon、priority、加載資源的contextClassLoader、ThreadLocal。
中斷
1)其它線(xiàn)程通過(guò)調(diào)用該線(xiàn)程的interrupt()方法對(duì)其進(jìn)行中斷。
2)如果該線(xiàn)程已經(jīng)結(jié)束,即使該線(xiàn)程被中斷過(guò),那么調(diào)用其interrupt()時(shí)返回false。
3)許多在聲明拋出InterruptedException的方法,如:sleep,在拋出InterruptedException之前,Java虛擬機(jī)會(huì)先將該線(xiàn)程的中斷標(biāo)識(shí)清除。
4)中斷狀態(tài)是線(xiàn)程的一個(gè)標(biāo)識(shí)位,可以用來(lái)取消或終止任務(wù)。終止時(shí)可以去清理資源。
@Override
public void run() {
while( ! Thread.currentThread().isInterrupted() ) { // 也可以自己定義一個(gè)flag
++i;
}
}
suspend stop resume棄用
suspend()調(diào)用后,線(xiàn)程不會(huì)釋放已經(jīng)占有的資源,如:鎖。而是占有著資源進(jìn)入睡眠狀態(tài),容易引起死鎖。stop()方法在終結(jié)一個(gè)線(xiàn)程時(shí)不會(huì)保證線(xiàn)程的資源正常釋放,導(dǎo)致程序可能工作在不確定狀態(tài)。
join
thread.join() 和 thread.join(long millis)
當(dāng)thread線(xiàn)程執(zhí)行完畢或等待millis時(shí)間后,才會(huì)繼續(xù)執(zhí)行當(dāng)前線(xiàn)程。