當一個線程被啟動後,如果再次調start()方法,將會拋出IllegalThreadStateException異常。 這是因為Java線程的生命周期只有一次。調用start()方法會導致系統在新線程中運行執行體,但是如果線程已經結束,則不能再次使用,需要重新創建一個新的線程對象並調用start()... ...
當一個線程被啟動後,如果再次調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?
Java面試題:你知道Spring的IOC嗎?那麼,它為什麼這麼重要呢?
Java面試題:Spring Bean線程安全?別擔心,只要你不寫併發代碼就好了!