Java面試題:如果你這樣做,你會後悔的,兩次啓動同一個線程~~~

當一個線程被啓動後,如果再次調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面試題:請談談對ThreadLocal的理解?

Java面試題:爲什麼HashMap不建議使用對象作爲Key?

Java面試題:你知道Spring的IOC嗎?那麼,它爲什麼這麼重要呢?

Java面試題:線程池內“鬧情緒”的線程,怎麼辦?

Java面試題:Spring Bean線程安全?別擔心,只要你不寫併發代碼就好了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章