多線程機制
首先多線程是Java內置對多線程的支持,顧名思義多線操作,一個應用中存在幾個執行體.
要注意的一點是,多線程實際上是JVM快速的在多個線程中來回切換,這些線程被輪流執行,使每個線程都有機會使用cpu資源
main線程
- 每個java程序都有一個缺省的主線程,JVM加載代碼,發現main方法后就會啟動一個線程稱為主線程
- 在main方法中再創建的其他線程稱為其他線程
線程的狀態與生命周期
(許多文章對于線程狀態都有不同的解釋,按自己理解就好,[菜鳥教程參考鏈接]
新建狀態
使用 new 關鍵字和 Thread 類或其子類建立一個線程對象后,具有相應內存空間,但是不處于JVM管理的線程中.就緒狀態
線程對象調用了start()方法之后,該線程就進入就緒狀態。就緒狀態的線程處于就緒隊列中,要等待JVM里線程調度器的調度。運行狀態
如果就緒狀態的線程獲取 CPU 資源,就可以執行 run(),此時線程便處于運行狀態。
當JVM將CPU使用權切換給線程時,如果線程是Thread子類創建的,該類中的run()方法就會立刻執行,且run()方法必須重寫,因為Thread類中run()方法沒有具體內容.
在run()方法結束前,不要再讓線程調用start()方法,否則會發生IllegalThreadStateException異常.-
阻塞狀態/中斷狀態
如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或獲得設備資源后可以重新進入就緒狀態。可以分為三種:等待阻塞:運行狀態中的線程執行 wait() 方法,使線程進入到等待阻塞狀態。
同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程占用)。
其他阻塞:通過調用線程的 sleep() 或 join() 發出了 I/O 請求時,線程就會進入到阻塞狀態。當sleep() 狀態超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程重新轉入就緒狀態。
死亡狀態
線程正常完成全部工作或被提前強制終止使線程不具備繼續運行的能力,隨之釋放分配給線程對象的內存.
線程調度和優先級
JVM中的線程調度器負責管理線程,線程優先級分為1-10.
- 線程優先級調整:setPriority(int newPriority)
- 查看當前線程對象優先級:getPriority()
- main線程優先級為默認優先級5
- java線程調度器的任務是高優先級的線程始終能運行.一旦時間片有空閑,使具有相同優先級的線程以輪流的方式順序使用時間片.(但是不推薦使用線程優先級來保證算法的正確運行)