“如果一個線程兩次調用start(),會出現什麼問題?” 如果這個問題出自阿裡p6崗位第一面的提問,你能回答出來嗎? 大家好,我是Mic,一個工作了14年的Java程式員。 關於這個問題,涉及到線程的生命周期,我把完整的回答整理到了15W字的面試文檔裡面大家可以私信我領取。 下麵來看看高手的回答。 ...
“如果一個線程兩次調用start(),會出現什麼問題?”
如果這個問題出自阿裡p6崗位第一面的提問,你能回答出來嗎?
大家好,我是Mic,一個工作了14年的Java程式員。
關於這個問題,涉及到線程的生命周期,我把完整的回答整理到了15W字的面試文檔裡面大家可以私信我領取。
下麵來看看高手的回答。
高手:
在Java裡面,一個線程只能調用一次start()方法,第二次調用會拋出IllegalThreadStateException。
一個線程本身是具備一個生命周期的。
在Java裡面,線程的生命周期包括6種狀態。
- NEW,線程被創建還沒有調用start啟動
- RUNNABLE,在這個狀態下的線程有可能是正在運行,也可能是在就緒隊列裡面等待操作系統進行調度分配CPU資源。
- BLOCKED,線程處於鎖等待狀態
- WAITING,表示線程處於條件等待狀態,當觸發條件後喚醒,比如wait/notify。
- TIMED_WAIT,和WAITING狀態相同,只是它多了一個超時條件觸發
- TERMINATED,表示線程執行結束
當我們第一次調用start()方法的時候,線程的狀態可能處於終止或者非NEW狀態下的其他狀態。
再調用一次start(),相當於讓這個正在運行的線程重新運行,不管從線程的安全性角度,還是從線程本身的執行邏輯,都是不合理的。
因此為了避免這個問題,線上程運行的時候會先判斷當前線程的運行狀態。
總結
這個問題非常簡單。
在面試過程中一般是作為熱身題目出現。
大家只需要回答出那個異常信息就行了。
深度理解線程,對我們的日常開發工作以及問題診斷工作,都非常有幫助。
大家記得點贊收藏加關註!!!
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!