-
一個線程調用兩次start會怎么樣
Java的線程是不允許啟動兩次的,第二次調用必然會拋出IllegalThreadStateException,這是一種運行時異常。 -
談談線程的生命周期和狀態轉移
- 新建(NEW),表示線程被創建出來還沒真正啟動的狀態,可以認為它是個Java內部狀態。
- 就緒(RUNNABLE),表示該線程已經在JVM中執行,當然由於執行需要計算資源,它可能是正在運行,也可能還在等待系統分配給它CPU片段,在就緒隊列里面排隊。
在其他一些分析中,會額外區分一種狀態RUNNING,但是從Java API的角度,並不能表示出來。 - 阻塞(BLOCKED),這個狀態和我們前面兩講介紹的同步非常相關,阻塞表示線程在等待Monitor lock。比如,線程試圖通過synchronized去獲取某個鎖,但是其他線程已經獨占了,那么當前線程就會處於阻塞狀態。
- 等待(WAITING),表示正在等待其他線程采取某些操作。一個常見的場景是類似生產者消費者模式,發現任務條件尚未滿足,就讓當前消費者線程等待(wait),另外的生產者線程去准備任務數據,然后通過類似notify等動作,通知消費線程可以繼續工作了。Thread.join()也會令線程進入等待狀態。
- 計時等待(TIMED_WAIT),其進入條件和等待狀態類似,但是調用的是存在超時條件的方法,比如wait或join等方法的指定超時版本,如下面示例:
public final native void wait(long timeout) throws InterruptedException; - 終止(TERMINATED),不管是意外退出還是正常執行結束,線程已經完成使命,終止運行。
-
怎么讓線程安全的停下來,stop()方法可以嗎?
stop不推薦使用,暴力終止可能無法完成清理性的工作,對鎖定的內容進行解鎖,容易造成數據不同步。安全停止線程的方式:- 增加停止標識,比如
while(flag){ //do something }
- run方法里面拋出異常
- 增加停止標識,比如