線程狀態:
與人有生老病死一樣,線程也同樣要經歷新建、就緒、運行(活動)、阻塞和死亡五種不同的狀態。這五種狀態都可以通過Thread類中的方法進行控制。
創建並運行線程:
① 新建狀態(New Thread):在Java語言中使用new 操作符創建一個線程后,該線程僅僅是一個空對象,它具備類線程的一些特征,但此時系統沒有為其分配資源,這時的線程處於創建狀態。
線程處於創建狀態時,可通過Thread類的方法來設置各種屬性,如線程的優先級(setPriority)、線程名(setName)和線程的類型(setDaemon)等。
② 就緒狀態(Runnable):使用start()方法啟動一個線程后,系統為該線程分配了除CPU外的所需資源,使該線程處於就緒狀態。此外,如果某個線程執行了yield()方法,那么該線程會被暫時剝奪CPU資源,重新進入就緒狀態。
③ 運行狀態(Running):Java運行系統通過調度選中一個處於就緒狀態的線程,使其占有CPU並轉為運行狀態。此時,系統真正執行線程的run()方法。
a) 可以通過Thread類的isAlive方法來判斷線程是否處於就緒/運行狀態:當線程處於就緒/運行狀態時,isAlive返回true,當isAlive返回false時,可能線程處於阻塞狀態,也可能處於停止狀態。
④ 阻塞和喚醒線程
阻塞狀態(Blocked):一個正在運行的線程因某些原因不能繼續運行時,就進入阻塞 狀態。這些原因包括:
a) 當執行了某個線程對象的sleep()等阻塞類型的方法時,該線程對象會被置入一個阻塞集內,等待超時而自動蘇醒。
b) 當多個線程試圖進入某個同步區域時,沒能進入該同步區域的線程會被置入鎖定集,直到獲得該同步區域的鎖,進入就緒狀態。
c) 當線程執行了某個對象的wait()方法時,線程會被置入該對象的等待集中,知道執行了該對象的notify()方法wait()/notify()方法的執行要求線程首先獲得該對象的鎖。
⑤ 死亡狀態(Dead):線程在run()方法執行結束后進入死亡狀態。此外,如果線程執行了interrupt()或stop()方法,那么它也會以異常退出的方式進入死亡狀態。
終止線程的三種方法
① 使用退出標志,使線程正常退出,也就是當run方法完成后線程終止,推薦使用。
② 使用stop方法強制終止線程(這個方法不推薦使用,因為stop和suppend、resume一樣,也可能發生不可預料的結果)。
③ 使用interrupt方法中斷線程。