新聞中心
[[409711]]
線程的概述
線程是一個程序的多個執(zhí)行路徑,執(zhí)行調(diào)度的單位,依托于進(jìn)程存在。 線程不僅可以共享進(jìn)程的內(nèi)存,而且還擁有一個屬于自己的內(nèi)存空間,這段內(nèi)存空間也叫做線程棧,是在建立線程時由系統(tǒng)分配的,主要用來保存線程內(nèi)部所使用的數(shù)據(jù),如線程執(zhí)行函數(shù)中所定義的變量。

注意:Java中的多線程是一種搶占機(jī)制而不是分時機(jī)制。搶占機(jī)制指的是有多個線程處于可運(yùn)行狀態(tài),但是一個CPU同時只允許一個線程在運(yùn)行,他們通過競爭的方式搶占CPU。
線程的狀態(tài)
NEW(新建狀態(tài)):當(dāng)一個線程的實(shí)例被創(chuàng)建即使用new關(guān)鍵字和Thread類或其子類創(chuàng)建一個線程對象后,此時該線程處于新生(new)狀態(tài),處于新生狀態(tài)的線程有自己的內(nèi)存空間,但該線程并沒有運(yùn)行,此時線程還不是活著的
RUNNABLE(就緒狀態(tài)):當(dāng)一個新建的線程執(zhí)行Thread.start()以后,線程進(jìn)入就緒狀態(tài)。這個狀態(tài)的線程已經(jīng)做好了運(yùn)行的準(zhǔn)備工作,但是還沒有真正執(zhí)行run方法的代碼。
RUNNING(運(yùn)行中):當(dāng)一個就緒狀態(tài)的線程,被CPU選中,分配時間片開始執(zhí)行,就進(jìn)入到運(yùn)行中狀態(tài)。這個狀態(tài)的線程已經(jīng)在真正執(zhí)行run方法。
BLOCKED(阻塞狀態(tài)):一個運(yùn)行中的線程,有兩種情況會進(jìn)入阻塞狀態(tài)。一個是等待獲取synchronized鎖的時候;另外一個是一個獲取到synchronized鎖的線程調(diào)用Object.wait方法后被喚醒,會進(jìn)入阻塞狀態(tài),因?yàn)樗枰匦芦@取之前已經(jīng)得到的鎖。該狀態(tài)下的線程,在取到鎖以后,進(jìn)入就緒狀態(tài)。
WAITING(等待狀態(tài)):一個運(yùn)行中的線程,執(zhí)行Object.wait()、Thread.join()、LockSupport.park()等方法就會進(jìn)入等待狀態(tài)。等待狀態(tài)的線程,需要被其他線程喚醒(Object.notifyAll()、LockSupport.unpark()),喚醒以后進(jìn)入就緒狀態(tài)。
TIMED_WAITING(等待一定時間狀態(tài)):一個運(yùn)行中的線程,執(zhí)行Thread.sleep(timeout)、Object.wait(timeout)、Thread.join(timeout)、LockSupport.parkNanos(timeout)、LockSupport.parkUntil(timeout)等方法進(jìn)入到等待一定時間狀態(tài)。這個狀態(tài)的線程,在等待超時或者被其他線程喚醒后,進(jìn)入到就緒狀態(tài)。
TERMINATED(終止?fàn)顟B(tài)):一個線程執(zhí)行完畢或者被異常中斷以后進(jìn)入該狀態(tài),該狀態(tài)下isAlive方法返回false。
常用方法
- start方法
start()用來啟動一個線程,當(dāng)調(diào)用start方法后,系統(tǒng)才會開啟一個新的線程來執(zhí)行用戶定義的子任務(wù),在這個過程中,會為相應(yīng)的線程分配需要的資源。
- run方法
run()方法是不需要用戶來調(diào)用的,當(dāng)通過start方法啟動一個線程之后,當(dāng)線程獲得了CPU執(zhí)行時間,便進(jìn)入run方法體去執(zhí)行具體的任務(wù)。
- sleep方法
sleep相當(dāng)于讓線程睡眠,交出CPU,讓CPU去執(zhí)行其他的任務(wù)。需要注意的是,sleep方法不會釋放鎖,也就是說如果當(dāng)前線程持有對某個對象的鎖,在sleep生效期間,其他線程是無法獲取該對象的synchronized鎖。
- yield方法
調(diào)用yield方法會讓當(dāng)前線程交出CPU權(quán)限,讓CPU去執(zhí)行其他的線程。它跟sleep方法類似,同樣不會釋放鎖。但是yield不能控制具體的交出CPU的時間,另外,yield方法只能讓擁有相同優(yōu)先級的線程有獲取CPU執(zhí)行時間的機(jī)會。yield方法讓線程從RUNNING狀態(tài)回到RUNNABLE狀態(tài)。
- join方法
A線程執(zhí)行B線程的join方法以后,A線程需要等B線程執(zhí)行完成以后才能繼續(xù)執(zhí)行。從狀態(tài)角度來講,A線程在執(zhí)行B線程的join方法以后,A線程進(jìn)入到WAITING或者TIMED_WAITING狀態(tài),一直等到B線程進(jìn)入到TERMINATED狀態(tài)或者等待超時以后,A線程才會回到RUNNABLE狀態(tài)。
- wait方法
wait方法是Object類就實(shí)現(xiàn)的方法,線程執(zhí)行該方法以后,進(jìn)入到WAITING或者TIMED_WAITING狀態(tài),在被其他線程喚醒或者等待超時后,進(jìn)入到RUNNABLE狀態(tài)。需要注意的是,調(diào)用wait方法會釋放已經(jīng)獲取到鎖,等線程被喚醒以后會進(jìn)入到BLOCKED狀態(tài)。直到重新拿到鎖以后,才會進(jìn)入到RUNNABLE狀態(tài)。
- notify/notifyAll方法
notify/notifyAll方法也是Object類就實(shí)現(xiàn)的方法,執(zhí)行該方法以后,可以喚醒等待隊(duì)列里面一個/全部線程,讓他們進(jìn)入到RUNNABLE狀態(tài)。
文章標(biāo)題:Java并發(fā)編程系列之一:Thread簡介
本文網(wǎng)址:http://www.dlmjj.cn/article/dppsscj.html


咨詢
建站咨詢
