Java基礎之線程機制(一)

要想學問大,就要多讀、多抄、多寫。要記住,一個人想要在學業上有所建樹,一定得堅持這樣做卡片、摘記。

一、線程的狀態

線程包括7種狀態:創建(new)、就緒(runable)、運行(running)、阻塞(blocked)、休眠等待(time waiting)等待(waiting)、結束(terminated)。

  1. 創建狀態(Thread.State.NEW),在代碼中使用new關鍵字爲Thread對象分配了內存空間,但是未調用start()方法。
  2. 就緒狀態(Thread.State.RUNNABLE),當調用start()方法後進入,但不會立刻被執行,需要等待獲得CPU時間片。
  3. 運行狀態(Thread.State中沒有對應枚舉),線程在就緒狀態下獲取到了需要的資源進入運行。
  4. 阻塞狀態(Thread.State.BLOCKED),線程在運行時進入鎖,會被阻塞,直到獲取鎖才能繼續運行。
  5. 休眠等待狀態(Thread.State.TIMED_WAITING),線程在運行時調用sleep(long)、wait(long)、join(long)帶有時長的方法時,會被阻塞到時間到達爲止。
  6. 等待狀態(Thread.State.WAITING),線程在運行時調用wait()、join()方法後被阻塞,等待notify()或者notifyAll()方法被調用。
  7. 結束狀態(Thread.State.TERMINATED),線程運行完成了所有代碼,或者意外中斷後,改變爲結束狀態。

二、線程的方法

  1. start()方法
  • 用來啓動一個線程,在這個過程中,爲該線程分配需要的資源,然後線程進入RUNNABLE狀態。
  1. run()方法
  • 該方法不需要用戶主動調用,當通過線程獲得CPU執行時間後,便進入run()方法執行具體的代碼。
  • 繼承Thread類必須重寫run()方法,並將需要執行的代碼寫入run()方法中。
  1. sleep(long millis)方法
  • 調用方法後,線程立刻交出CPU執行時間,並在設置的時間內不參與CPU執行時間的獲取,線程狀態變爲TIMED_WAITING狀態。
  • 該方法與wait()方法對比,它不會交釋放鎖,在休眠期間其他對象已經不能訪問被其佔用的資源。
  • 休眠時間結束後,不一定會立刻開始執行,需要等到下一次獲取CPU執行時間才能繼續執行後續代碼。
  1. yield()方法
  • 調用方法後,線程讓出CPU執行時間,並且只能讓擁有相同優先級的線程競爭CPU執行時間。
  • 該方法不會讓線程進入阻塞狀態,不釋放鎖,並且很少被使用到(在java.util.concurrent.locks中有一些實際應用)。
  1. join()方法
  • 調用該方法的線程,會獲得該方法的鎖(這時其它調用該方法會進入BLOCKED狀態等待鎖的釋放),然後又調用wait()釋放鎖和CPU執行時間並掛起當前線程,反覆執行這個過程,直到線程執行完成進入TERMINATED狀態,調用方法的線程纔會重新開始執行。
  1. interrupt()方法
  • 調用該方法可以使得處於阻斷狀態的線程拋出InterruptedException異常,併爲線程設置中斷的標記。
  • interrupted()是靜態方法,調用後返回對應線程的中斷狀態,並恢復中斷狀態。
  • isInterrupted()方法用於判斷線程的中斷狀態,返回True或False。
  1. stop()、destroy()、suspend()、resume()

說明

  • 文章內容來自源碼註釋和網絡資料,如有錯誤請一定指出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章