當一個線程被啓動後,如果再次調start()方法,將會拋出IllegalThreadStateException異常。
這是因爲Java線程的生命週期只有一次。調用start()方法會導致系統在新線程中運行執行體,但是如果線程已經結束,則不能再次使用,需要重新創建一個新的線程對象並調用start()方法。
以下是代碼示例:
public class ThreadTest { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("Thread started"); } }); // 第一次調用start方法 thread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 第二次調用start方法,會拋出IllegalThreadStateException異常 thread.start(); } }
上述代碼中,我們在一個新的線程中啓動了一個執行體,並等待1秒鐘後再次調用 start()方法。在第二次調用start()方法時,由於該線程已經執行完畢,此時會拋出IllegalThreadStateException異常。
測試結果:
Thread started Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:708) at com.gmb.springcloud.ThreadTest.main(ThreadTest.java:20)
Java線程是一種操作系統級別的資源,線程的啓動和結束都需要涉及到對應的操作系統調度。在Java中,每個線程只能被啓動一次,並且一旦線程結束,它的狀態就不能再改變。這也是爲什麼如果同一個線程對象調用了兩次start()方法會拋出 IllegalThreadStateException異常的原因。
在底層實現上,當我們調用Thread類的start()方法時,JVM會首先檢查當前線程的狀態是否爲NEW(新建)狀態,如果不是,則拋出異常。如果當前線程狀態正確,則將該線程加入到調度隊列中等待操作系統調度執行。此時,線程的狀態會從NEW轉換爲 RUNNABLE(可運行)狀態,並開始執行其中的run()方法。由於一個線程只能被執行一次,因此當我們嘗試再次調用start()方法時,JVM會檢測當前線程狀態是否處於已結束(TERMINATED)狀態或者死亡(DEAD)狀態。如果是,那麼該線程無法被重新啓動,因爲該線程已經完成了所需的任務並退出了。
綜上所述,每個線程只能被啓動一次,不能重複啓動。這也是爲什麼如果一個線程兩次調用start()方法就會拋出異常的原因。
往期面試題:
Java面試題:@PostConstruct、init-method和afterPropertiesSet執行順序?
Java面試題:SimpleDateFormat是線程安全的嗎?使用時應該注意什麼?
Java面試題:細數ThreadLocal大坑,內存泄露本可避免
Java面試題:爲什麼HashMap不建議使用對象作爲Key?