Java 多線程基礎:Thread 類核心用法詳解

一、線程創建

1. 繼承 Thread 類(傳統寫法)

class MyThread extends Thread {  @Override  public void run() {  System.out.println("線程執行");  }  
}  
// 使用示例
MyThread t = new MyThread();  
t.start();  

缺點:Java 單繼承限制,靈活性差。

2. 實現 Runnable 接口(解耦推薦)

class MyRunnable implements Runnable {  @Override  public void run() {  System.out.println("線程執行");  }  
}  
// 使用示例
Thread t = new Thread(new MyRunnable());  
t.start();  

優點:避免單繼承問題,任務與線程解耦。

3. 匿名內部類(簡化寫法)

(1)繼承 Thread 的匿名內部類

Thread t = new Thread() {  @Override  public void run() {  System.out.println("通過繼承Thread的匿名內部類創建的線程");  }  
};  
t.start();  

特點

  • 直接繼承 Thread,重寫 run()
  • 缺點:無法再繼承其他類,靈活性低。

(2)實現 Runnable 的匿名內部類

Thread t = new Thread(new Runnable() {  @Override  public void run() {  System.out.println("通過實現Runnable的匿名內部類創建的線程");  }  
});  
t.start();  

優點

  • 任務與線程解耦,保留繼承能力。

(3)兩種匿名內部類的對比

維度繼承 Thread 的匿名類實現 Runnable 的匿名類
繼承限制占用繼承資格(無法繼承其他類)無繼承限制
代碼靈活性低(任務與線程綁定)高(任務與線程解耦)
Lambda 支持不支持(需重寫 run() 方法)支持(Runnable 是函數式接口)
推薦場景簡單的一次性任務通用場景,尤其是需要解耦任務與線程時

4. Lambda 表達式(Java 8+ 推薦)

Thread t = new Thread(() -> System.out.println("線程執行"));  
t.start();  

優點:語法糖,簡化 Runnable 匿名類寫法。


二、線程中斷

核心方法interrupt()

Thread t = new Thread(() -> {  while (!Thread.currentThread().isInterrupted()) {  System.out.println("運行中");  }  
});  
t.start();  
// 中斷線程  
t.interrupt();  

關鍵點

  • interrupt() 設置中斷標志位,需在代碼中主動檢查。
  • 若線程在 sleep()/wait() 中,調用 interrupt() 會拋出 InterruptedException,并清空中斷標志
  • 處理中斷的正確姿勢
try {  Thread.sleep(1000);  
} catch (InterruptedException e) {  // 重置中斷標志或退出線程  Thread.currentThread().interrupt();  break;  
}  

三、線程等待

核心方法join()

Thread t = new Thread(() -> {  System.out.println("子線程執行");  
});  
t.start();  
t.join();  // 主線程等待 t 執行完畢  
System.out.println("主線程繼續");  

參數擴展

  • join(long millis):最多等待指定毫秒。
    適用場景:需要確保線程執行順序(如線程B依賴線程A的結果)。

四、線程休眠

核心方法sleep()

Thread.sleep(1000);  // 休眠1秒,釋放CPU  

特點

  • 不釋放鎖(與 wait() 不同)。
  • 讓權:休眠期間不參與CPU調度。

五、獲取線程實例

核心方法Thread.currentThread()

Thread t = Thread.currentThread();  
System.out.println("當前線程:" + t.getName());  

用途:在 Runnable 任務當中獲取當前線程引用。


總結

  • 創建線程:優先使用 Runnable + Lambda。
  • 中斷處理:檢查標志位或捕獲異常,確保資源釋放。
  • 線程控制join() 協調執行順序,sleep() 主動讓權。
  • 最佳實踐:避免繼承 Thread,保持任務與線程解耦。

結語
多線程編程是提升程序性能的利器,但也像一把雙刃劍——用得好,事半功倍;用不好,bug 叢生。通過本文,我們探討了 Thread 類的核心用法,從線程創建、中斷控制到協作與休眠,每一步都關乎程序的效率與穩定。

記住:優先選擇 Runnable ** + Lambda**,讓任務與線程解耦;謹慎處理線程安全,避免數據競爭的“暗坑”;善用 join()sleep(),在并發中尋求秩序。

如果你在實戰中遇到過有趣的線程問題,或有更好的實踐心得,歡迎在評論區分享——技術之路,唯有交流才能走得更遠。🎯

愿你的代碼在多線程的世界里,既快如閃電,又穩如磐石!

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

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

相關文章

Django 中時區的理解

背景 設置時區為北京時間 TIME_ZONE ‘Asia/Shanghai’ # 啟用時區支持 USE_TZ True 這樣設置的作用 前端 (實際上前端el-date-picker 顯示的是當地時區的時間) Element組件轉換后,我們是東八區,前端傳給后端的時間為&…

C# 深入理解類(成員常量)

成員常量 成員常量類似前一章所述的局部常量,只是它們被聲明在類聲明中而不是方法內,如下面的 示例: 與局部常量類似,用于初始化成員肯量的值在編譯時必須是可計算的,而且通常是一個預定 義簡單類型或由它們組成的表達…

【深度學習】#12 計算機視覺

主要參考學習資料: 《動手學深度學習》阿斯頓張 等 著 【動手學深度學習 PyTorch版】嗶哩嗶哩跟李沐學AI 目錄 目標檢測錨框交并比(IoU)錨框標注真實邊界框分配偏移量計算損失函數 非極大值抑制預測 多尺度目標檢測單發多框檢測(S…

MCP實戰:在扣子空間用扣子工作流MCP,一句話生成兒童故事rap視頻

扣子最近迎來重要更新,支持將扣子工作流一鍵發布成MCP,在扣子空間里使用。 這個功能非常有用,因為我有很多業務工作流是在扣子平臺上做的,兩者打通之后,就可以在扣子空間里直接通過對話方式調用扣子工作流了&#xff0…

Redis學習打卡-Day3-分布式ID生成策略、分布式鎖

分布式 ID 當單機 MySQL 已經無法支撐系統的數據量時,就需要進行分庫分表(推薦 Sharding-JDBC)。在分庫之后, 數據遍布在不同服務器上的數據庫,數據庫的自增主鍵已經沒辦法滿足生成的主鍵全局唯一了。這個時候就需要生…

LabVIEW光譜信號仿真與數據處理

在光譜分析領域,LabVIEW 憑借其圖形化編程、豐富函數庫及強大數據處理能力,成為高效工具。本案例將介紹如何利用 LabVIEW 仿真光譜信號,并對實際采集的光譜數據進行處理,涵蓋信號生成、數據采集、濾波、分析及顯示等環節。 ? 一…

nginx相關面試題30道

一、基礎概念與核心特性 1. 什么是 Nginx?它的主要用途有哪些? 答案: Nginx 是一款高性能的開源 Web 服務器、反向代理服務器及負載均衡器,基于事件驅動的異步非阻塞架構,擅長處理高并發場景。 主要用途:…

數據庫實驗報告 數據定義操作 3

實驗報告(第3次) 實驗名稱 數據定義操作 實驗時間 10月12日1-2節 一、實驗內容 1、本次實驗是用sql語句創建庫和表,語句是固定的,要求熟記這些sql語句。 二、源程序及主…

霍夫圓變換全面解析(OpenCV)

文章目錄 一、霍夫圓變換基礎1.1 霍夫圓變換概述1.2 圓的數學表達與參數化 二、霍夫圓變換算法實現2.1 標準霍夫圓變換算法流程2.2 參數空間的表示與優化 三、關鍵參數解析3.1 OpenCV中的HoughCircles參數3.2 參數調優策略 四、Python與OpenCV實現參考4.1 基本實現代碼4.2 改進…

記錄一次修改nacos安全問題導致服務調用出現404

1、nacos默認值修改 nacos.core.auth.plugin.nacos.token.secret.key**** nacos.core.auth.server.identity.key******** nacos.core.auth.server.identity.value************ 重啟nacos, 這時候微服務的token認證會立即失效,等待自動重連認證或者手動重啟服務 2、…

Python面試總結

hello,大家好,我是potato,我總結一下最近的面試遇到的問題~ 1.Python開發(軟通動力) 自我介紹主要問了項目(YOLOv11)項目遇到的難點和解決方法is,列表和元組的區別Python多線程有什么問題?Pyt…

5.18 day24

知識點回顧: 元組可迭代對象os模塊 作業:對自己電腦的不同文件夾利用今天學到的知識操作下,理解下os路徑。 元組 元組的特點: 有序,可以重復,這一點和列表一樣 元組中的元素不能修改,這一點…

Uniapp中小程序調用騰訊地圖(獲取定位地址)

1、先配置權限: 這是上圖的代碼: "permission": { "scope.userLocation": { "desc": "你的位置信息將用于小程序位置接口的效果展示" } } 第二步:寫代碼: //下面是uniapp的模版代碼 主…

寫spark程序數據計算( 數據庫的計算,求和,匯總之類的)連接mysql數據庫,寫入計算結果

1. 添加依賴 在項目的 pom.xml&#xff08;Maven&#xff09;中添加以下依賴&#xff1a; xml <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0…

nginx服務器實驗

1.實驗要求 1&#xff09;在Nginx服務器上搭建LNMP服務&#xff0c;并且能夠對外提供Discuz論壇服務。 在Web1、Web2服務器上搭建Tomcat 服務。 2&#xff09;為nginx服務配置虛擬主機&#xff0c;新增兩個域名 www.kgc.com 和 www.benet.com&#xff0c;使用http://www.kgc.…

Spring Boot 與 RabbitMQ 的深度集成實踐(一)

引言 ** 在當今的分布式系統架構中&#xff0c;隨著業務復雜度的不斷提升以及系統規模的持續擴張&#xff0c;如何實現系統組件之間高效、可靠的通信成為了關鍵問題。消息隊列作為一種重要的中間件技術&#xff0c;應運而生并發揮著舉足輕重的作用。 消息隊列的核心價值在于其…

c++多線程debug

debug demo 命令行查看 ps -eLf|grep cam_det //查看當前運行的輕量級進程 ps -aux | grep 執行文件 //查看當前運行的進程 ps -aL | grep 執行文件 //查看當前運行的輕量級進程 pstree -p 主線程ID //查看主線程和新線程的關系 查看線程棧結構 pstack 線程ID 步驟&…

10.7 LangChain v0.3架構大升級:模塊化設計+多階段混合檢索,開發效率飆升3倍!

LangChain v0.3 技術生態與未來發展 關鍵詞:LangChain Chains, Agents 架構, Retrieval Strategy, LangGraph, 模塊化設計 3. LangChain 項目:Chains, Agents, Retrieval Strategy LangChain v0.3 通過 Chains-Agents-Retrieval 三位一體的技術棧,構建起完整的大模型應用開…

分布式 ID 生成的五種方法:優缺點與適用場景

0.簡介 在分布式系統中&#xff0c;生成全局唯一的id是一個常見的需求。由于分布式系統的特性&#xff08;多節點&#xff0c;網絡分區&#xff0c;時鐘不同步等&#xff09;&#xff0c;傳統的單機ID生成方式不再適用&#xff0c;所以一些分布式生成方式應運而生&#xff0c;…

基于單片機路燈自動控制儀仿真設計

標題:基于單片機路燈自動控制儀仿真設計 內容:1.摘要 本設計旨在解決傳統路燈控制方式效率低、能耗大的問題&#xff0c;開展了基于單片機的路燈自動控制儀仿真設計。采用單片機作為核心控制單元&#xff0c;結合光照傳感器、時鐘模塊等硬件&#xff0c;運用相關軟件進行編程和…