Java 線程重點 面試筆記(線程狀態,安全停止線程..)

包括線程狀態、Thread.yield()、Thread.join()、線程安全停止、標志位、中斷等,都是線程這塊秋招的重點。


1. 線程狀態(Thread.State)

Java 中線程有 6 種狀態

狀態

含義

進入條件

NEW

新建狀態

Thread t = new Thread(...);

RUNNABLE

可運行狀態

調用 start() 后,等待 CPU 調度

BLOCKED

阻塞狀態

等待鎖(synchronized)

WAITING

無時間限制等待

Object.wait()、Thread.join()(無超時)、LockSupport.park()

TIMED_WAITING

有時間限制的等待

sleep(millis)、join(millis)、wait(millis)

TERMINATED

終止狀態

線程執行完 run() 方法

注意

  • RUNNABLE 不一定在 CPU 上運行,只是處于可運行隊列中。

  • BLOCKED、WAITING、TIMED_WAITING 是阻塞線程狀態。

2. Thread.yield()

作用:提示線程調度器,當前線程愿意讓出 CPU,但只是“禮貌性提示”,不保證立即切換。

效果:線程從 RUNNING → RUNNABLE,允許同優先級線程運行。

特點

  • 不阻塞線程

  • 不釋放鎖

示例

for (int i = 0; i < 10; i++) {System.out.println(i);Thread.yield(); // 提示調度器切換線程
}

3. Thread.join()

作用:讓當前線程等待調用 join() 的線程執行完成。

效果:當前線程進入 WAITING 或 TIMED_WAITING,直到被等待的線程 TERMINATED

可選超時:join(long millis),超時后線程繼續執行。

示例

Thread a = new Thread(() -> System.out.println("線程A執行"));
a.start();
a.join(); // 當前線程等待a執行完
System.out.println("主線程繼續");

4. 安全停止線程

4.1 原則

  • Java 不推薦使用 stop()、suspend()、resume(),會破壞資源和鎖,容易死鎖。

  • 推薦方式:使用標志位(flag)或 interrupt() 請求中斷。

4.2 標志位(Flag)

概念:線程內部定義的布爾變量,用于表示線程是否繼續運行。

特點

  • 線程自己檢查標志位決定是否退出

  • 使用 volatile 修飾保證線程可見性

    這里使用volatile是因為,volatile可以使當前變量的變化能立即被別的線程看到。

示例

class DownloadTask implements Runnable {private volatile boolean running = true;public void stop() {running = false;}@Overridepublic void run() {while (running) {System.out.println("下載中...");}System.out.println("線程停止");}
}

4.3 中斷線程(Interrupt)

概念:interrupt() 不是直接停止線程,而是發出中斷請求,線程自己決定是否退出。

阻塞線程:sleep()、wait()、join() 會拋 InterruptedException。

非阻塞循環:線程需檢查 isInterrupted() 或結合標志位。

示例

class DownloadTask implements Runnable {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(500); // 阻塞操作,可響應中斷} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 重新設置中斷標志break; // 安全退出循環}System.out.println("下載中...");}System.out.println("線程安全停止");}
}Thread t = new Thread(new DownloadTask());
t.start();
Thread.sleep(2000);
t.interrupt(); // 請求停止線程

核心理解

  • interrupt() 只是一種請求,不強制停止

  • 循環型任務檢查中斷標志,阻塞任務捕獲異常退出

  • 標志位適合循環任務,interrupt 適合阻塞任務

5. 小結

  1. 線程狀態:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

  2. yield():禮貌性讓出 CPU

  3. join():等待線程完成,可帶超時

  4. 安全停止線程

    • 循環任務用 標志位

    • 阻塞任務用 interrupt() + 異常處理

  5. 阻塞 vs 非阻塞:阻塞線程可響應 interrupt,非阻塞線程需自己檢查標志

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98107.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Zigbee:Polling 終端設備的睡眠機制和功耗

一、Zigbee 設備類型與功耗基礎 首先,Zigbee網絡中的設備角色決定了其功耗特性。Zigbee定義了三種邏輯設備類型: 協調器 (Coordinator)??:網絡的中心,必須始終供電,不能睡眠。功耗最高。 路由器 (Router)??:負責中繼數據,擴展網絡范圍。通常也需持續供電,以保持網…

Python迭代協議完全指南:從基礎到高并發系統實現

引言&#xff1a;迭代協議的核心價值在Python編程中&#xff0c;迭代協議是構建高效、靈活數據結構的基石。根據2024年Python開發者調查報告&#xff1a;92%的高級數據結構依賴迭代協議85%的數據處理框架基于迭代協議構建78%的并發系統使用自定義迭代器65%的內存優化方案通過迭…

vsan高可用:確保可訪問性、全部數據遷移,兩種類型權衡

目錄1.如果我3臺機器&#xff0c;其中有1臺機器突然故障&#xff0c;那么走的是保證可用&#xff0c;還是全量數據遷移&#xff1f;這個怎么算&#xff1f;一、先明確&#xff1a;故障場景 vs 維護場景的核心差異二、3臺主機故障時&#xff0c;vSAN的具體處理邏輯&#xff08;為…

51單片機1(單片機基礎,LED,數碼管)

1.嵌入式嵌入式&#xff08;Embedded&#xff09;指的是一種專用計算機系統&#xff0c;它被"嵌入"或內建到一個更大的設備、產品或系統中&#xff0c;作為其核心控制部分&#xff0c;專門用于執行特定的任務或功能。通俗來講就是以應用為中心&#xff0c;以計算機技…

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技術(收發器/接收器)和無人機跟蹤應答器

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技術&#xff08;收發器/接收器&#xff09;和無人機跟蹤應答器Aerobits 是一家專門為無人機 (UAV) 和無人駕駛飛機開發微型應答器和航空電子系統的公司。我們的硬件和軟件解決方案基于專利技術&#xff0c;采用極低 SWaP 封裝…

Spring Security資源服務器在高并發場景下的認證性能優化實踐指南

Spring Security資源服務器在高并發場景下的認證性能優化實踐指南 摘要&#xff1a;本文從原理與實踐兩個層面&#xff0c;深入解析Spring Security資源服務器在高并發場景下的認證性能優化策略&#xff0c;通過關鍵源碼解讀與實際示例&#xff0c;幫助開發者有效提升系統吞吐與…

SQL Server事務隔離級別

SQL Server 提供了多個事務隔離級別&#xff0c;用于控制并發事務如何訪問和修改數據時的可見性、鎖定行為以及可能遇到的并發問題&#xff08;如臟讀、不可重復讀、幻讀&#xff09;。這些級別在數據一致性、并發性能和鎖定開銷之間進行權衡。 以下是 SQL Server 支持的主要隔…

DeepSeek R1大模型微調實戰-llama-factory的安裝與使用

文章目錄概要1.安裝必要的環境2.安裝 PyTorch3.安裝 Transformers 和 Datasets4.克隆 LLaMA Factory 倉庫和安裝LLaMA Factory5.準備數據和模型配置6.運行 LLaMA Factory7.監控和調整8.后續步驟概要 LLaMA Factory 是一個簡單易用且高效的大型語言模型訓練與微調平臺。通過它&…

IDE mac M芯片安裝報錯:如何解決“InsCode.app 已損壞”,無法打開

IDE mac M芯片安裝報錯&#xff1a;如何解決“InsCode.app 已損壞”&#xff0c;無法打開 摘要 在 macOS 上安裝并運行 InsCode IDE 時&#xff0c;不少開發者會遇到這樣的報錯&#xff1a; “InsCode.app 已損壞&#xff0c;無法打開。您應該將它移到廢紙簍。” 這種情況在 …

EasyExcel:阿里開源的高效 Excel 處理工具,輕松解決 POI 內存溢出問題

在日常開發中&#xff0c;Excel 文件的導入導出是非常常見的需求。無論是數據批量導入、報表生成還是數據備份&#xff0c;我們都離不開對 Excel 的操作。但傳統的 POI 框架在處理大數據量 Excel 時&#xff0c;常常會遇到內存溢出的問題&#xff0c;讓開發者頭疼不已。 今天給…

軟件啟動時加配置文件 vs 不加配置文件

一、基本概念不加配置文件啟動直接執行啟動命令&#xff0c;使用軟件自帶的默認參數。方便、快速&#xff0c;適合測試環境。缺點&#xff1a;靈活性差、配置不可控、不安全。redis-server zookeeper-server-start.sh kafka-server-start.sh指定配置文件啟動啟動時加載外部配置…

[ubuntu][C++]onnxruntime安裝cpu版本后測試代碼

下載官方預編譯包后&#xff0c;怎么用呢。可以參考這個源碼跑測試環境&#xff1a;ubuntu22.04onnxruntime1.18.0測試代碼&#xff1a;CMakeLists.txtcmake_minimum_required(VERSION 3.12) project(onnx_test)# 設置C標準 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD…

棧:有效的括號

題目描述&#xff1a;給定一個只包含‘[’,{,(,),},]的字符串&#xff0c;判斷該字符串是否括號有效。 括號有效的要求是&#xff1a; 每個左括號都有對應的右括號。每個右括號都有對應的左括號。左括號必須以正確的順序閉合。 示例 1&#xff1a; 輸入&#xff1a;s "…

微前端架構:解構前端巨石應用的藝術

在數字化轉型浪潮中&#xff0c;企業級前端應用正變得日益復雜。微前端架構作為一種創新的解決方案&#xff0c;正在重新定義大型前端應用的構建方式&#xff0c;使多個團隊能夠獨立開發和部署功能模塊一、微前端架構的核心價值理念微前端架構的本質是將后端微服務理念擴展到前…

《LangChain從入門到精通》系統學習教材大綱

&#x1f4da; 《LangChain從入門到精通》系統學習教材大綱 目標&#xff1a;幫助你系統掌握LangChain理論與實踐&#xff0c;成為具備獨立開發能力的AI應用開發者。 學習周期建議&#xff1a;8~12周&#xff08;每天2~3小時&#xff09;&#xff0c;配合項目實戰可加速成長。 …

Redis 的相關文件作用

Java 項目中使用 Redis 的相關文件&#xff0c;下面我來逐一解釋它們的作用&#xff1a;1. RedisDemoApplicationTests.java 作用&#xff1a;這是 Spring Boot 項目的測試類。用途&#xff1a; 通常用于寫單元測試或集成測試。測試 Redis 功能是否正常&#xff0c;比如連接、讀…

【React】性能提升方案:Reat.memo, useMemo,useCallback用法詳解

前言&#xff1a;Reat.memo, useMemo,useCallback是React中用于性能優化的三個核心API&#xff0c;它們分別針對組件渲染&#xff0c;計算緩存和函數引用進行優化。一、React.memo作用&#xff1a;緩存組件&#xff0c;當父組件重新渲染時&#xff0c;若子組件的props未變化&am…

Alibaba Cloud Linux 3 安裝Docker

Alibaba Cloud Linux 3 基于 Red Hat Enterprise Linux (RHEL) 兼容內核&#xff0c;安裝 Docker 的步驟與 RHEL/CentOS 系列類似&#xff0c;以下是具體操作&#xff1a; 1. 卸載舊版本&#xff08;如有&#xff09; sudo dnf remove docker docker-client docker-client-la…

每日一練001.pm

題目詳情&#xff1a; P5705 【深基2.例7】數字反轉 - 洛谷 題目描述 輸入一個不小于 100 且小于 1000&#xff0c;同時包括小數點后一位的一個浮點數&#xff0c; 例如 123.4 &#xff0c;要求把這個數字翻轉過來&#xff0c;變成 4.321 并輸出。 #include<iostream&g…

AI智能優化SEO關鍵詞策略實戰

本文聚焦AI如何智能優化SEO關鍵詞策略&#xff0c;通過實戰案例分享高效技巧&#xff0c;幫助提升網站搜索排名和流量轉化效果。內容涵蓋AI革新關鍵詞策略的原理、智能優化技巧的實際應用、高效關鍵詞布局方法、避免常見錯誤的實戰指南&#xff0c;以及綜合策略推動排名飛躍的路…