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

来源:https://www.cnblogs.com/marsitman/p/18188653
-Advertisement-
Play Games

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

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

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

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在將紙質文檔掃描成PDF電子文檔時,有時可能會出現頁面方向翻轉或者頁面順序混亂的情況。為了確保更好地瀏覽和查看PDF文件,本文將分享一個使用Python來旋轉PDF頁面或者調整PDF頁面順序的解決方案。 要實現Python對PDF頁面進行設置,我們需要用到第三方庫 Spire.PDF for Pyt ...
  • theme: condensed-night-purple highlight: androidstudio 主從複製原理 建立連接 從節點在配置了 replicaof 配置了主節點的ip和port 從庫執行replicaof 併發送psync命令 同步數據到從庫 主庫bgsave生成RDB文件,並 ...
  • Java Chassis 3通過介面維度負載均衡的策略設置,為不同的應用場景提供了非常強大的負載均衡管理能力,幫助解決負載不均衡、會話粘滯等應用負載問題。 ...
  • 通過本文,我們深入瞭解了 Django 框架的一些基本概念和使用方法,以及如何利用 Django 構建一個簡單的圖像上傳應用程式。從項目創建到環境配置,再到 admin 端圖像處理和用戶圖片上傳,我們逐步學習瞭如何利用 Django 提供的功能快速搭建 Web 應用。無論是對於初學者還是有一定經驗的... ...
  • 運算符與表達式 Created: November 29, 2023 10:38 PM 運算符 運算符 釋義 +、-、*、/ 略 **、//、% 乘方、整除(向下取整至最接近的整數、餘數 <<、>> 指的是二進位左右移 &按位與 按位與是針對二進位數的操作,指將兩個二進位數的每一位都進行比較,如果兩 ...
  • 在現代社會中,機動車已經成為人們生活的重要交通工具。而行駛證作為機動車的身份證明,具有重要的法律效力。然而,對於行駛證上的信息進行手工識別是一項繁瑣的工作,容易出現錯誤,並且耗時較長。為瞭解決這個問題,挖數據平臺提供了行駛證OCR識別Api介面,可以對行駛證上的信息進行快速準確地識別和提取。 這個A ...
  • 大家好,我是 Java陳序員。 問君能有幾多愁,開源項目解千愁! 今天,給大家介紹一個快速開發平臺,完全開源可商用! 關註微信公眾號:【Java陳序員】,獲取開源項目分享、AI副業分享、超200本經典電腦電子書籍等。 項目介紹 SmartAdmin —— 一個簡潔、高效、安全的快速開發平臺,以高質 ...
  • 大家好,我是R哥。 金三銀四結束了,上個月分享了一個 35K 入職的面試輔導案例: 35K*14 薪入職了,這公司只要不裁員,我能一直呆下去。。 今天再分享一個上個月讓人很有成就感的面試輔導 case: 外包、空窗四個月、薪資 10k、996 ——> 甲方公司、薪資15k、早九晚六(WLB),從報名 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...