面試連環炮系列(十):一個線程調用兩次start會怎么樣


  1. 一個線程調用兩次start會怎么樣
    Java的線程是不允許啟動兩次的,第二次調用必然會拋出IllegalThreadStateException,這是一種運行時異常。

  2. 談談線程的生命周期和狀態轉移

    • 新建(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),不管是意外退出還是正常執行結束,線程已經完成使命,終止運行。
  3. 怎么讓線程安全的停下來,stop()方法可以嗎?
    stop不推薦使用,暴力終止可能無法完成清理性的工作,對鎖定的內容進行解鎖,容易造成數據不同步。安全停止線程的方式:

    • 增加停止標識,比如while(flag){ //do something }
    • run方法里面拋出異常

參考(部分摘抄的文字版權屬於原作者):

https://blog.csdn.net/zl1zl2zl3/article/details/80776112


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM