1:線(xiàn)程
(1)線(xiàn)程也叫輕量級(jí)進(jìn)程舰讹。它擁有各自的計(jì)數(shù)器娃承、堆棧和局部變量等屬性,并且能夠訪(fǎng)問(wèn)共享的內(nèi)存變量桩匪。
(2)一個(gè)java程序的運(yùn)行不僅僅是main()方法的運(yùn)行打瘪,而是main線(xiàn)程和多個(gè)其他線(xiàn)程的同時(shí)運(yùn)行。
(3)如果要設(shè)置線(xiàn)程的優(yōu)先級(jí)吸祟,那么需要注意:針對(duì)頻繁阻塞(休眠或者I/O操作)的線(xiàn)程需要設(shè)置較高的優(yōu)先級(jí)瑟慈;而偏重計(jì)算(需要較多CPU時(shí)間或者偏運(yùn)算)的線(xiàn)程則設(shè)置較低的優(yōu)先級(jí),確保處理器不會(huì)被獨(dú)占屋匕。
(4)注意:線(xiàn)程優(yōu)先級(jí)不能作為程序正確性的依賴(lài)葛碧,因?yàn)椴僮飨到y(tǒng)可以完全不用理會(huì)java線(xiàn)程對(duì)于優(yōu)先級(jí)的設(shè)定。
博客:jstack工具使用过吻?http://blog.csdn.net/fenglibing/article/details/6411999
(5)java線(xiàn)程的運(yùn)行生命周期进泼,在給定的某一個(gè)時(shí)刻,線(xiàn)程只能處于一個(gè)狀態(tài)纤虽。
下面是JAVA線(xiàn)程狀態(tài)變遷圖:
說(shuō)明:
NEW狀態(tài)—一個(gè)被創(chuàng)建的線(xiàn)程乳绕,但是還沒(méi)有調(diào)用start方法。
BLOCKED狀態(tài)—一個(gè)線(xiàn)程因?yàn)榈却R界區(qū)的鎖被阻塞產(chǎn)生的狀態(tài)逼纸。(Lock或者synchronize關(guān)鍵字產(chǎn)生的狀態(tài)洋措。)
WAITING狀態(tài)—一個(gè)線(xiàn)程進(jìn)入了鎖,但是需要等待其他線(xiàn)程執(zhí)行某些操作杰刽,時(shí)間不確定菠发。(當(dāng)wait,join,park方法調(diào)用時(shí)王滤,進(jìn)入waiting狀態(tài),前提是這個(gè)線(xiàn)程已經(jīng)擁有鎖啦滓鸠。)
TIMED_WAITTING狀態(tài)—一個(gè)線(xiàn)程進(jìn)入了鎖雁乡,但是需要等待其他線(xiàn)程執(zhí)行某些操作,時(shí)間確定糜俗。(通過(guò)sleep或者wait timeout方法進(jìn)入的限期等待的狀態(tài)踱稍。)
TERMINATED狀態(tài)—退出
注意容易混淆的概念:阻塞在JUC包中LOCK接口的線(xiàn)程狀態(tài)卻是等待狀態(tài),因?yàn)镴UC包中LOCK接口對(duì)于阻塞的實(shí)現(xiàn)均使用了LockSupport類(lèi)中的相關(guān)方法悠抹。
(5)Daemon線(xiàn)程珠月,當(dāng)java虛擬機(jī)中不存在非Daemon線(xiàn)程的時(shí)候,java虛擬機(jī)將會(huì)退出锌钮。
注意1:Daemon屬性需要在啟動(dòng)線(xiàn)程之前設(shè)置桥温,不能在啟動(dòng)線(xiàn)程之后設(shè)置。
注意2:在構(gòu)建Daemon線(xiàn)程時(shí)梁丘,不能依靠finally塊中的內(nèi)容來(lái)確保執(zhí)行關(guān)閉或清理資源的邏輯侵浸。
2:?jiǎn)?dòng)和終止線(xiàn)程
(1)線(xiàn)程的構(gòu)建記住一句話(huà):一個(gè)新構(gòu)造的線(xiàn)程對(duì)象是由其parent線(xiàn)程來(lái)進(jìn)行空間分配的,而child線(xiàn)程繼承了parent是否為Daemon氛谜、優(yōu)先級(jí)和加載資源的contextClassLoader以及可繼承的ThreadLocal掏觉,同時(shí)還會(huì)分配一個(gè)唯一的ID來(lái)標(biāo)識(shí)這個(gè)child線(xiàn)程。至此值漫,一個(gè)能夠運(yùn)行的線(xiàn)程對(duì)象就初始化好啦澳腹,在堆內(nèi)存中等待著運(yùn)行。
(2)中斷杨何?簡(jiǎn)單的說(shuō):中斷好比其他線(xiàn)程對(duì)該線(xiàn)程打了招呼酱塔,其他線(xiàn)程通過(guò)調(diào)用該線(xiàn)程的interrupt()方法對(duì)其進(jìn)行中斷操作。
(3)廢棄的API:suspend()暫停危虱、resume()恢復(fù)羊娃、stop()停止,為啥廢棄呢埃跷?因?yàn)槌钟墟i蕊玷,不釋放,可能導(dǎo)致死鎖弥雹。致命的的是也不支持中斷垃帅。
(4)如何安全的終止線(xiàn)程呢?一種方法:使用中斷來(lái)取消或停止任務(wù)剪勿。另一種方法:利用一個(gè)boolean變量來(lái)控制是否需要停止任務(wù)并終止該線(xiàn)程贸诚。
3:線(xiàn)程間通信
(1)一個(gè)線(xiàn)程一旦開(kāi)始運(yùn)行哭靖,就擁有自己的椩吲荩空間勤庐。
(2)volatile可以用來(lái)修飾字段(成員變量)曙搬,就是告知程序任何對(duì)該變量的訪(fǎng)問(wèn)均需要從共享內(nèi)存中獲取,而對(duì)它的改變必須同步刷新回共享內(nèi)存媒怯,它能保證所有線(xiàn)程對(duì)變量訪(fǎng)問(wèn)的可見(jiàn)性。
(3)sychronized實(shí)現(xiàn)原理:對(duì)一個(gè)對(duì)象的監(jiān)視器(monitor)進(jìn)行獲取髓窜,而這個(gè)獲取過(guò)程是排他的扇苞。也就是同一時(shí)刻只能有一個(gè)線(xiàn)程獲取到由synchronized所保護(hù)對(duì)象的監(jiān)視器。
對(duì)象寄纵、對(duì)象監(jiān)視器鳖敷、同步隊(duì)列和執(zhí)行線(xiàn)程之間的關(guān)系
任意線(xiàn)程對(duì)Object(Object由synchronized保護(hù))的訪(fǎng)問(wèn),首先要獲得Object的監(jiān)視器程拭。如果獲取失敗定踱,線(xiàn)程進(jìn)入同步隊(duì)列,線(xiàn)程狀態(tài)變?yōu)锽LOCKED恃鞋。當(dāng)訪(fǎng)問(wèn)Object的前驅(qū)(獲得了鎖的線(xiàn)程)釋放了鎖崖媚,則該釋放操作喚醒阻塞在同步隊(duì)列中的線(xiàn)程,使其嘗試對(duì)監(jiān)視器的獲取恤浪。
(3)等待/通知機(jī)制是任意java對(duì)象都具備的畅哑,因?yàn)槎x在Object里面。下面是等待/通知相關(guān)方法:
使用wait()水由、notify()荠呐、notifyAll()時(shí)需要注意的細(xì)節(jié):
1)使用wait()、notify()砂客、notifyAll()時(shí)需要先調(diào)用對(duì)象加鎖泥张。
2)調(diào)用wait()方法后,線(xiàn)程狀態(tài)由RUNNING變?yōu)閃AITING鞠值,并將當(dāng)前線(xiàn)程放置到等待隊(duì)列中媚创。
3)notify()或notifyAll()方法調(diào)用后,等待線(xiàn)程依舊不會(huì)從wait()返回齿诉,需要調(diào)用notify()或notifyAll()的線(xiàn)程釋放鎖之后筝野,等待線(xiàn)程才有機(jī)會(huì)從wait()返回。
4)notify()方法將等待隊(duì)列中的一個(gè)等待線(xiàn)程從等待隊(duì)列中移到同步隊(duì)列中粤剧,而notifyAll()方法則是將等待隊(duì)列中所有的線(xiàn)程全部移到同步隊(duì)列歇竟,被移動(dòng)的線(xiàn)程狀態(tài)由WAITING變?yōu)锽LOCKED。
5)從wait()方法返回的前期是或得了調(diào)用對(duì)象的鎖抵恋。
(4)等待/通知的經(jīng)典范式焕议,分別針對(duì)等待方(消費(fèi)者)和通知方(生產(chǎn)者)
等待方遵循如下原則:
a:獲取對(duì)象的鎖
b:如果條件不滿(mǎn)足,那么調(diào)用對(duì)象的wait()方法弧关,被通知后仍要檢查條件盅安。
c:條件滿(mǎn)足則執(zhí)行對(duì)應(yīng)邏輯唤锉。
通知方遵循如下原則:
a:獲得對(duì)象的鎖。
b:改變條件
c:通知所有等待在對(duì)象上的線(xiàn)程别瞭。
(5)管道輸入/輸出流和普通文件的輸入/輸出流或者網(wǎng)絡(luò)輸入/輸出流不同處:它主要用于線(xiàn)程之間的數(shù)據(jù)傳輸窿祥,而傳輸?shù)拿浇闉閮?nèi)存。
PipedOutputStream蝙寨、PipedInputStream面向字節(jié)
PipedWriter晒衩、PipedReader面向字符
(6)Thread.join():如果一個(gè)線(xiàn)程A執(zhí)行了thread.join()語(yǔ)句,表示:當(dāng)前線(xiàn)程A等待thread線(xiàn)程終止后才從thread.join()返回墙歪。這里涉及了等待/通知機(jī)制(等待前驅(qū)線(xiàn)程結(jié)束听系,接收前驅(qū)線(xiàn)程結(jié)束通知)
(7)ThreadLocal(線(xiàn)程變量)的使用。它是一個(gè)以ThreadLocal對(duì)象為鍵虹菲、任意對(duì)象為值的存儲(chǔ)結(jié)構(gòu)靠胜。這個(gè)結(jié)構(gòu)會(huì)被附帶在線(xiàn)程上,也就是說(shuō)一個(gè)線(xiàn)程可以根據(jù)一個(gè)ThreadLocal對(duì)象查詢(xún)到綁定在這個(gè)線(xiàn)程上的一個(gè)值毕源。
4:線(xiàn)程應(yīng)用實(shí)例
(1)等待超時(shí)模式?(使用等待超時(shí)模式來(lái)構(gòu)造一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池浪漠。)
(2)線(xiàn)程池技術(shù)?(使用線(xiàn)程池技術(shù)構(gòu)建一個(gè)簡(jiǎn)單的web服務(wù)器脑豹。)