線程實(shí)現(xiàn)
1谜喊、擴(kuò)展java.lang.Thread類(lèi)格带。
此類(lèi)中有個(gè)run()方法赎懦,應(yīng)該注意其用法:
public void run()
如果該線程是使用獨(dú)立的Runnable運(yùn)行對(duì)象構(gòu)造的鞍帝,則調(diào)用該Runnable對(duì)象的run方法升酣;否則舷暮,該方法不執(zhí)行任何操作并返回。
Thread的子類(lèi)應(yīng)該重寫(xiě)該方法噩茄。
2下面、實(shí)現(xiàn)java.lang.Runnable接口。
void run()
使用實(shí)現(xiàn)接口Runnable的對(duì)象創(chuàng)建一個(gè)線程時(shí)巢墅,啟動(dòng)該線程將導(dǎo)致在獨(dú)立執(zhí)行的線程中調(diào)用對(duì)象的run方法诸狭。
方法run的常規(guī)協(xié)定是券膀,它可能執(zhí)行任何所需的操作。
獲取當(dāng)前線程的對(duì)象的方法是:Thread.currentThread()驯遇;
睡眠的實(shí)現(xiàn):調(diào)用靜態(tài)方法芹彬。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Java中的鎖
當(dāng)數(shù)據(jù)競(jìng)爭(zhēng)存在的時(shí)候,最簡(jiǎn)單的解決辦法就是加鎖叉庐。鎖機(jī)制限制在同一時(shí)間只允許一個(gè)線程訪問(wèn)產(chǎn)生競(jìng)爭(zhēng)的數(shù)據(jù)的臨界區(qū)舒帮。Java語(yǔ)言中的 synchronized關(guān)鍵字可以為一個(gè)代碼塊或是方法進(jìn)行加鎖。任何Java對(duì)象都有一個(gè)自己的監(jiān)視器陡叠,可以進(jìn)行加鎖和解鎖操作玩郊。當(dāng)受到 synchronized關(guān)鍵字保護(hù)的代碼塊或方法被執(zhí)行的時(shí)候,就說(shuō)明當(dāng)前線程已經(jīng)成功的獲取了對(duì)象的監(jiān)視器上的鎖枉阵。當(dāng)代碼塊或是方法正常執(zhí)行完成或是發(fā)生異常退出的時(shí)候译红,當(dāng)前線程所獲取的鎖會(huì)被自動(dòng)釋放。一個(gè)線程可以在一個(gè)Java對(duì)象上加多次鎖兴溜。同時(shí)JVM保證了在獲取鎖之前和釋放鎖之后侦厚,變量的值是與主存中的內(nèi)容同步的。
線程的同步
在有些情況下拙徽,僅依靠線程之間對(duì)數(shù)據(jù)的互斥訪問(wèn)是不夠的刨沦。有些線程之間存在協(xié)作關(guān)系,需要按照一定的協(xié)議來(lái)協(xié)同完成某項(xiàng)任務(wù)膘怕,比如典型的生產(chǎn)者-消費(fèi)者模式想诅。這種情況下就需要用到Java提供的線程之間的等待-通知機(jī)制。當(dāng)線程所要求的條件不滿(mǎn)足時(shí)岛心,就進(jìn)入等待狀態(tài)来破;而另外的線程則負(fù)責(zé)在合適的時(shí)機(jī)發(fā)出通知來(lái)喚醒等待中的線程。Java中的java.lang.Object類(lèi)中的[wait]
volatile
用volatile修飾的變量忘古,線程在每次使用變量的時(shí)候讳癌,都會(huì)讀取變量修改后的最的值
中斷線程
通過(guò)一個(gè)線程對(duì)象的interrupt()方法可以向該線程發(fā)出一個(gè)中斷請(qǐng)求。中斷請(qǐng)求是一種線程之間的協(xié)作方式存皂。當(dāng)線程A通過(guò)調(diào)用線程B的interrupt()方法來(lái)發(fā)出中斷請(qǐng)求的時(shí)候晌坤,線程A 是在請(qǐng)求線程B的注意。線程B應(yīng)該在方便的時(shí)候來(lái)處理這個(gè)中斷請(qǐng)求旦袋,當(dāng)然這不是必須的骤菠。當(dāng)中斷發(fā)生的時(shí)候,線程對(duì)象中會(huì)有一個(gè)標(biāo)記來(lái)記錄當(dāng)前的中斷狀態(tài)疤孕。通過(guò)isInterrupted()方法可以判斷是否有中斷請(qǐng)求發(fā)生商乎。如果當(dāng)中斷請(qǐng)求發(fā)生的時(shí)候,線程正處于阻塞狀態(tài)祭阀,那么這個(gè)中斷請(qǐng)求會(huì)導(dǎo)致該線程退出阻塞狀態(tài)鹉戚。
volatile 變量對(duì)所有線程是立即可見(jiàn)的,對(duì) volatile 變量所有的寫(xiě)操作都能立即反應(yīng)到
其他線程之中,換句話說(shuō):volatile 變量在各個(gè)線程中是一致的,所以基于 volatile 變量的運(yùn)算是線程安全的
ThreadLocal
ThreadLocal是一個(gè)線程內(nèi)部的數(shù)據(jù)存儲(chǔ)類(lèi)鲜戒,通過(guò)它可以在指定的線程中存儲(chǔ)數(shù)據(jù),數(shù)據(jù)存儲(chǔ)以后抹凳,只有在指定線程中可以獲取到存儲(chǔ)的數(shù)據(jù)遏餐,對(duì)于其它線程來(lái)說(shuō)無(wú)法獲取到數(shù)據(jù)