線程
為提高cpu的利用率以及解決實(shí)時(shí)性問(wèn)題,多線程油然而生?!?/p>
線程中優(yōu)先級(jí)高不代表一定能先執(zhí)行
實(shí)現(xiàn)多線程有兩種方式:
1.繼承Thread類
2.實(shí)現(xiàn)Runnable接口
繼承Therad的線程類不能繼承其他類;通過(guò)static修飾也可共享資源,但不能滿足大量數(shù)據(jù)的需求
實(shí)現(xiàn)Runnable接口的實(shí)現(xiàn)類還可以繼承其他類,可讓多個(gè)線程共享實(shí)現(xiàn)類的資源
多線程通過(guò)搶占cpu來(lái)提供利用率以及解決實(shí)時(shí)性問(wèn)題,也因此導(dǎo)致線程的運(yùn)行軌跡不確定
多線程的某個(gè)線程運(yùn)行可能會(huì)在任意位置因?yàn)閏pu時(shí)間片結(jié)束而導(dǎo)致被切換出去,當(dāng)再次搶占cpu也會(huì)在切換位置繼續(xù)執(zhí)行下去
多線程的線程是獨(dú)立運(yùn)行,互不干擾,可共享資源,但是很容易導(dǎo)致數(shù)據(jù)錯(cuò)亂(線程安全問(wèn)題)
解決線程的安全問(wèn)題也是線程同步的實(shí)現(xiàn),有兩種方式:
1.同步代碼塊
2.同步方法
線程的生命周期
新生狀態(tài):使用new關(guān)鍵字建立一個(gè)線程后,該線程對(duì)象就處于新生狀態(tài),調(diào)用start()方法可進(jìn)入就緒狀態(tài)
就緒狀態(tài):具備運(yùn)行條件,等待cpu的調(diào)度
運(yùn)行狀態(tài):執(zhí)行該線程的run方法中代碼,直到因某原因阻塞進(jìn)入阻塞狀態(tài)? 或者正常完成任務(wù)而進(jìn)入死亡狀態(tài)
阻塞狀態(tài):阻塞狀態(tài)下的線程不能進(jìn)入就緒狀態(tài),只有當(dāng)因某原因而進(jìn)入阻塞狀態(tài)的原因消除時(shí),才可進(jìn)入就緒狀態(tài)。
死亡狀態(tài):正常完成任務(wù)、線程被強(qiáng)制性終止或是線程拋出未捕獲的異常
同步代碼塊
synchronized?(mutex) {
??// .. .
}
mutex 稱為互斥鎖/同步鎖。對(duì)共享資源進(jìn)行加鎖實(shí)現(xiàn)同步。一般用共享資源作為同步鎖,也稱同步監(jiān)視器。
同步代碼塊中同步監(jiān)視器(mutex) 可以是任何對(duì)象
同步方法
private synchronized void xxx() {
? ? // .. .
??????????? }
把普通方法用synchronized 修飾,同步方法的同步監(jiān)視器是this。