要想學問大,就要多讀、多抄、多寫。要記住,一個人想要在學業上有所建樹,一定得堅持這樣做卡片、摘記。
一、線程的狀態
線程包括7種狀態:創建(new)、就緒(runable)、運行(running)、阻塞(blocked)、休眠等待(time waiting)等待(waiting)、結束(terminated)。
- 創建狀態(Thread.State.NEW),在代碼中使用new關鍵字爲Thread對象分配了內存空間,但是未調用start()方法。
- 就緒狀態(Thread.State.RUNNABLE),當調用start()方法後進入,但不會立刻被執行,需要等待獲得CPU時間片。
- 運行狀態(Thread.State中沒有對應枚舉),線程在就緒狀態下獲取到了需要的資源進入運行。
- 阻塞狀態(Thread.State.BLOCKED),線程在運行時進入鎖,會被阻塞,直到獲取鎖才能繼續運行。
- 休眠等待狀態(Thread.State.TIMED_WAITING),線程在運行時調用sleep(long)、wait(long)、join(long)帶有時長的方法時,會被阻塞到時間到達爲止。
- 等待狀態(Thread.State.WAITING),線程在運行時調用wait()、join()方法後被阻塞,等待notify()或者notifyAll()方法被調用。
- 結束狀態(Thread.State.TERMINATED),線程運行完成了所有代碼,或者意外中斷後,改變爲結束狀態。
二、線程的方法
- start()方法
- 用來啓動一個線程,在這個過程中,爲該線程分配需要的資源,然後線程進入RUNNABLE狀態。
- run()方法
- 該方法不需要用戶主動調用,當通過線程獲得CPU執行時間後,便進入run()方法執行具體的代碼。
- 繼承Thread類必須重寫run()方法,並將需要執行的代碼寫入run()方法中。
- sleep(long millis)方法
- 調用方法後,線程立刻交出CPU執行時間,並在設置的時間內不參與CPU執行時間的獲取,線程狀態變爲TIMED_WAITING狀態。
- 該方法與wait()方法對比,它不會交釋放鎖,在休眠期間其他對象已經不能訪問被其佔用的資源。
- 休眠時間結束後,不一定會立刻開始執行,需要等到下一次獲取CPU執行時間才能繼續執行後續代碼。
- yield()方法
- 調用方法後,線程讓出CPU執行時間,並且只能讓擁有相同優先級的線程競爭CPU執行時間。
- 該方法不會讓線程進入阻塞狀態,不釋放鎖,並且很少被使用到(在java.util.concurrent.locks中有一些實際應用)。
- join()方法
- 調用該方法的線程,會獲得該方法的鎖(這時其它調用該方法會進入BLOCKED狀態等待鎖的釋放),然後又調用wait()釋放鎖和CPU執行時間並掛起當前線程,反覆執行這個過程,直到線程執行完成進入TERMINATED狀態,調用方法的線程纔會重新開始執行。
- interrupt()方法
- 調用該方法可以使得處於阻斷狀態的線程拋出InterruptedException異常,併爲線程設置中斷的標記。
- interrupted()是靜態方法,調用後返回對應線程的中斷狀態,並恢復中斷狀態。
- isInterrupted()方法用於判斷線程的中斷狀態,返回True或False。
- stop()、destroy()、suspend()、resume()
- 這些方法已經被棄用。
- ORACLE官方給出瞭解釋,點擊鏈接查看官網。
說明
- 文章內容來自源碼註釋和網絡資料,如有錯誤請一定指出。