Java并發(fā)編程系列之一:Thread簡介
線程的概述
線程是一個程序的多個執(zhí)行路徑,執(zhí)行調(diào)度的單位,依托于進程存在。 線程不僅可以共享進程的內(nèi)存,而且還擁有一個屬于自己的內(nèi)存空間,這段內(nèi)存空間也叫做線程棧,是在建立線程時由系統(tǒng)分配的,主要用來保存線程內(nèi)部所使用的數(shù)據(jù),如線程執(zhí)行函數(shù)中所定義的變量。
注意:Java中的多線程是一種搶占機制而不是分時機制。搶占機制指的是有多個線程處于可運行狀態(tài),但是一個CPU同時只允許一個線程在運行,他們通過競爭的方式搶占CPU。
線程的狀態(tài)
NEW(新建狀態(tài)):當一個線程的實例被創(chuàng)建即使用new關(guān)鍵字和Thread類或其子類創(chuàng)建一個線程對象后,此時該線程處于新生(new)狀態(tài),處于新生狀態(tài)的線程有自己的內(nèi)存空間,但該線程并沒有運行,此時線程還不是活著的
RUNNABLE(就緒狀態(tài)):當一個新建的線程執(zhí)行Thread.start()以后,線程進入就緒狀態(tài)。這個狀態(tài)的線程已經(jīng)做好了運行的準備工作,但是還沒有真正執(zhí)行run方法的代碼。
RUNNING(運行中):當一個就緒狀態(tài)的線程,被CPU選中,分配時間片開始執(zhí)行,就進入到運行中狀態(tài)。這個狀態(tài)的線程已經(jīng)在真正執(zhí)行run方法。
BLOCKED(阻塞狀態(tài)):一個運行中的線程,有兩種情況會進入阻塞狀態(tài)。一個是等待獲取synchronized鎖的時候;另外一個是一個獲取到synchronized鎖的線程調(diào)用Object.wait方法后被喚醒,會進入阻塞狀態(tài),因為它需要重新獲取之前已經(jīng)得到的鎖。該狀態(tài)下的線程,在取到鎖以后,進入就緒狀態(tài)。
WAITING(等待狀態(tài)):一個運行中的線程,執(zhí)行Object.wait()、Thread.join()、LockSupport.park()等方法就會進入等待狀態(tài)。等待狀態(tài)的線程,需要被其他線程喚醒(Object.notifyAll()、LockSupport.unpark()),喚醒以后進入就緒狀態(tài)。
TIMED_WAITING(等待一定時間狀態(tài)):一個運行中的線程,執(zhí)行Thread.sleep(timeout)、Object.wait(timeout)、Thread.join(timeout)、LockSupport.parkNanos(timeout)、LockSupport.parkUntil(timeout)等方法進入到等待一定時間狀態(tài)。這個狀態(tài)的線程,在等待超時或者被其他線程喚醒后,進入到就緒狀態(tài)。
TERMINATED(終止狀態(tài)):一個線程執(zhí)行完畢或者被異常中斷以后進入該狀態(tài),該狀態(tài)下isAlive方法返回false。

常用方法
- start方法
start()用來啟動一個線程,當調(diào)用start方法后,系統(tǒng)才會開啟一個新的線程來執(zhí)行用戶定義的子任務(wù),在這個過程中,會為相應(yīng)的線程分配需要的資源。
- run方法
run()方法是不需要用戶來調(diào)用的,當通過start方法啟動一個線程之后,當線程獲得了CPU執(zhí)行時間,便進入run方法體去執(zhí)行具體的任務(wù)。
- sleep方法
sleep相當于讓線程睡眠,交出CPU,讓CPU去執(zhí)行其他的任務(wù)。需要注意的是,sleep方法不會釋放鎖,也就是說如果當前線程持有對某個對象的鎖,在sleep生效期間,其他線程是無法獲取該對象的synchronized鎖。
- yield方法
調(diào)用yield方法會讓當前線程交出CPU權(quán)限,讓CPU去執(zhí)行其他的線程。它跟sleep方法類似,同樣不會釋放鎖。但是yield不能控制具體的交出CPU的時間,另外,yield方法只能讓擁有相同優(yōu)先級的線程有獲取CPU執(zhí)行時間的機會。yield方法讓線程從RUNNING狀態(tài)回到RUNNABLE狀態(tài)。
- join方法
A線程執(zhí)行B線程的join方法以后,A線程需要等B線程執(zhí)行完成以后才能繼續(xù)執(zhí)行。從狀態(tài)角度來講,A線程在執(zhí)行B線程的join方法以后,A線程進入到WAITING或者TIMED_WAITING狀態(tài),一直等到B線程進入到TERMINATED狀態(tài)或者等待超時以后,A線程才會回到RUNNABLE狀態(tài)。
- wait方法
wait方法是Object類就實現(xiàn)的方法,線程執(zhí)行該方法以后,進入到WAITING或者TIMED_WAITING狀態(tài),在被其他線程喚醒或者等待超時后,進入到RUNNABLE狀態(tài)。需要注意的是,調(diào)用wait方法會釋放已經(jīng)獲取到鎖,等線程被喚醒以后會進入到BLOCKED狀態(tài)。直到重新拿到鎖以后,才會進入到RUNNABLE狀態(tài)。
- notify/notifyAll方法
notify/notifyAll方法也是Object類就實現(xiàn)的方法,執(zhí)行該方法以后,可以喚醒等待隊列里面一個/全部線程,讓他們進入到RUNNABLE狀態(tài)。


























