Java 多線程創建:三種主要方法

多線程編程是Java中一個重要的技術點,它允許程序并行執行多個任務,從而提高程序的執行效率。本文將詳細介紹在Java中創建多線程的三種主要方法:繼承Thread類、實現Runnable接口以及使用CallableFuture接口。

1. 繼承 Thread

繼承Thread類是創建線程的最直接方式。通過創建一個繼承自Thread類的類,并重寫run()方法,可以將線程執行的任務放入其中。

步驟:
  1. 創建一個類繼承java.lang.Thread類。
  2. 重寫run()方法,將線程執行的任務放入run()方法中。
  3. 創建該類的實例。
  4. 調用實例的start()方法啟動線程。
示例代碼:
class MyThread extends Thread {@Overridepublic void run() {// 線程執行的任務for (int i = 0; i < 5; i++) {System.out.println("Thread running: " + i);try {Thread.sleep(1000); // 線程休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 啟動線程}
}
優點:
  • 簡單直接,代碼清晰。
  • 適用于不需要共享資源的場景。
缺點:
  • 由于Java不支持多繼承,如果繼承了Thread類,就不能繼承其他類。
  • 不適用于需要共享資源的場景,因為每個線程都是獨立的Thread實例。

2. 實現 Runnable 接口

實現Runnable接口是另一種創建線程的方法,它避免了Java單繼承的限制。通過實現Runnable接口的類,并實現其run()方法,可以將線程執行的任務放入其中。

步驟:
  1. 創建一個類實現java.lang.Runnable接口。
  2. 實現run()方法,將線程執行的任務放入run()方法中。
  3. 創建Runnable實現類的實例。
  4. 創建Thread類的實例,并將Runnable實例傳遞給Thread構造函數。
  5. 調用Thread實例的start()方法啟動線程。
示例代碼:
class MyRunnable implements Runnable {@Overridepublic void run() {// 線程執行的任務for (int i = 0; i < 5; i++) {System.out.println("Runnable running: " + i);try {Thread.sleep(1000); // 線程休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start(); // 啟動線程}
}
優點:
  • 可以實現資源共享,適用于多個線程訪問同一個資源的場景。
  • 靈活性更高,因為可以通過實現接口來繼承其他類。
缺點:
  • 需要額外創建一個Thread實例,代碼相對稍微復雜。

3. 使用 CallableFuture

如果需要在線程執行任務后獲取結果,可以使用Callable接口。與Runnable不同,Callablecall()方法可以返回結果,并且可以拋出異常。通過FutureTask類可以包裝Callable對象,并將其傳遞給Thread對象啟動線程。

步驟:
  1. 創建一個類實現java.util.concurrent.Callable接口。
  2. 實現call()方法,將線程執行的任務和返回結果放入call()方法中。
  3. 創建Callable實現類的實例。
  4. 創建FutureTask實例,并將Callable實例傳遞給FutureTask構造函數。
  5. 創建Thread類的實例,并將FutureTask實例傳遞給Thread構造函數。
  6. 調用Thread實例的start()方法啟動線程。
  7. 調用FutureTask實例的get()方法獲取線程執行結果。
示例代碼:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<Integer> {@Overridepublic Integer call() {// 線程執行的任務int sum = 0;for (int i = 0; i < 5; i++) {sum += i;System.out.println("Callable running: " + i);try {Thread.sleep(1000); // 線程休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}return sum; // 返回計算結果}
}public class Main {public static void main(String[] args) {MyCallable myCallable = new MyCallable();FutureTask<Integer> futureTask = new FutureTask<>(myCallable);Thread thread = new Thread(futureTask);thread.start(); // 啟動線程try {// 獲取線程執行結果Integer result = futureTask.get();System.out.println("Result: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}
優點:
  • 可以在線程任務完成后獲取返回結果。
  • 可以拋出異常并進行處理。
缺點:
  • 相對來說比Runnable接口實現稍微復雜一些。
  • 需要額外的FutureTask來包裝Callable實例。

總結

在Java中創建多線程的方法各有優缺點,選擇哪種方法取決于具體的使用場景和需求。繼承Thread類適用于簡單的線程任務實現,而實現Runnable接口則更靈活,適用于需要共享資源的場景。使用CallableFuture接口不僅可以獲取線程執行結果,還可以處理任務執行中的異常,更適合復雜的線程任務管理。

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

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

相關文章

【前端每日基礎】day34——HTTP和HTTPS

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是互聯網通信協議&#xff0c;用于在Web瀏覽器和Web服務器之間傳輸數據。以下是對HTTP和HTTPS的詳細介紹&#xff1a; HTTP&#xff08;Hypertext…

Ubuntu server 24 (Linux) IPtables 雙網卡 共享上網NAT 安裝配置DHCP

一 開啟路由轉發功能 sudo vim /etc/sysctl.conf net.ipv4.ip_forward1 sudo sysctl -p 二 安裝DHCP #更新軟件包列表&#xff1a; sudo apt update #安裝DHCP服務器 sudo apt install isc-dhcp-server #修改監聽網卡,根據實際修改 sudo vi /etc/default/isc-dhcp-server …

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理進行身…

Tailwindcss Layout布局相關樣式及實戰案例,5萬字長文,附完整源碼和效果截圖

aspect 相關樣式類 基礎樣式 ClassPropertiesaspect-autoaspect-ratio: auto;aspect-squareaspect-ratio: 1 / 1;aspect-videoaspect-ratio: 16 / 9; 案例&#xff1a;引入B站視頻 Use the aspect-* utilities to set the desired aspect ratio of an element. 使用’ asp…

兩款 IntelliJ IDEA 的 AI 編程插件

介紹兩款 IntelliJ IDEA 的 AI 編程插件&#xff1a;通義靈碼和 CodeGeeX。 通義靈碼 這是由阿里推出的一個基于通義大模型的 AI 編碼助手。 它提供了代碼智能生成、研發智能問答等功能。通義靈碼經過海量優秀開源代碼數據訓練&#xff0c;可以根據當前代碼文件及跨文件的上下…

kafka-偏移量圖解

生產者偏移量&#xff1a;生產者發送消息時寫入到哪個位置&#xff08;主題的每個分區會存儲一個 leo 即將寫入消息的偏移量&#xff09;&#xff0c;每次寫完消息 leo 會 1 消費者偏移量&#xff1a;消費者從哪個位置開始消費消息&#xff0c;小于等于 leo&#xff0c;每個組…

數據賦能(107)——體系:數據采集——概述、關注焦點

概述 數據采集是指利用特定設備或技術&#xff0c;從原始數據源中捕獲和記錄數據的過程。 數據采集的主要目的是為了獲取特定目標或現象的相關信息&#xff0c;以支持后續的數據分析、決策制定、業務優化等過程。 數據采集的重要性在于為企業和組織提供了關鍵的信息基礎&…

【Qt】對話框

文章目錄 1 :peach:對話框介紹:peach:2 :peach:對話框的分類:peach:2.1 :apple:模態對話框:apple:2.2 :apple:非模態對話框:apple:2.3 :apple:混合屬性對話框:apple: 3 :peach:Qt 內置對話框:peach:3.1 :apple:消息對話框 QMessageBox:apple: 1 &#x1f351;對話框介紹&#x…

如何配置Oracle的ACL權限

配置Oracle的ACL&#xff08;訪問控制列表&#xff09;權限是一個涉及多個步驟的過程。以下是一個清晰的步驟指南&#xff0c;用于配置Oracle的ACL權限&#xff1a; 1. 創建ACL 使用DBMS_NETWORK_ACL_ADMIN.CREATE_ACL過程來創建一個新的ACL。 sql BEGIN DBMS_NETWORK_ACL_…

pod 控制器介紹

一 pod 控制器相關理論介紹 1&#xff0c;Pod控制器 是什么 Pod控制器&#xff0c;又稱之為工作負載&#xff08;workload&#xff09;&#xff0c;是用于實現管理pod的中間層&#xff0c;確保pod資源符合預期的狀態&#xff0c;pod的資源出現故障時&#xff0c;會嘗試進行…

頭歌springboot初體驗

頭歌(HeadGo)平臺上的Spring Boot初體驗課程為學習者提供了一個深入了解和實踐Spring Boot 框架的機會。以下是對頭歌Spring Boot初體驗課程的清晰歸納和介紹: 1. 課程概述 目標:通過本課程,學習者將能夠掌握Spring Boot的基礎知識、核心特性和實踐應用。 內容:課程內容…

[數據集][目標檢測]水下管道泄漏破損檢測數據集VOC+YOLO格式2069張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;2069 標注數量(xml文件個數)&#xff1a;2069 標注數量(txt文件個數)&#xff1a;2069 標注…

【2024年5月備考新增】】 考前篇(30)《必備資料(13) - 論文串講-干系人管理》

過程定義輸入工具技術輸出實際應用識別干系人識別能影響項目決策、 活動或結果的個人、 群體或組織,以及被 項目決策、活動或結 果所影響的個人、群 體或組織,并分析和 記錄他們的相關信息 的過程1、項目章程2、立項管理文件 3、項目管理計劃.溝通管理計劃.干系人參與計劃 4、…

時間序列的譜分解pt.2

16.dvi (berkeley.edu)https://www.stat.berkeley.edu/~bartlett/courses/153-fall2010/lectures/16.pdfpt1 時間序列的譜分解-CSDN博客

理解不同層的表示(layer representations)

在機器學習和深度學習領域&#xff0c;特別是在處理音頻和自然語言處理&#xff08;NLP&#xff09;任務時&#xff0c;"層的表示"&#xff08;layer representations&#xff09;通常是指神經網絡不同層在處理輸入數據時生成的特征或嵌入。這些表示捕獲了輸入數據的…

PostgreSQL的視圖pg_locks

PostgreSQL的視圖pg_locks pg_locks 是 PostgreSQL 提供的系統視圖&#xff0c;用于顯示當前數據庫中的鎖信息。通過查詢這個視圖&#xff0c;數據庫管理員可以監控鎖的使用情況&#xff0c;識別潛在的鎖爭用和死鎖問題&#xff0c;并優化數據庫性能。 pg_locks 視圖字段說明…

新書推薦:1.2 動態鏈接庫與API

本節必須掌握的知識點&#xff1a; kernel32.dll user32.dll gdi32.dll ■動態鏈接庫 最早的軟件開發過程&#xff0c;所有的功能實現都是有程序員獨立完成的。在這個過程中&#xff0c;我們很快就會發現&#xff0c;有很多常用的功能模塊是可以重復利用的&#xff0c;我們將…

【2024年5月備考新增】】 考前篇(29)《必備資料(12) - 論文串講-溝通管理》

過程定義輸入工具技術輸出實際應用規劃 溝通 管理根據干系人的信 息需求和要求及 組織的可用資產 情況,制訂合適 的項目溝通方式 和計劃的過程1、項目章程2、項目管理計劃.資源管理計劃.干系人參與計劃 3、項目文件.需求文件.干系人登記冊4、事業環境因組織過程資1、專家判斷2…

Nginx服務的主配置文件及配置舉例

Nginx服務的主配置文件 安裝Nginx認識Nginx服務全局配置I/O 事件配置HTTP 配置日志格式設定 訪問狀態統計配置查看Nginx已安裝模塊修改 nginx.conf 配置文件重啟服務&#xff0c;訪問測試 基于授權的訪問控制準備用戶密碼認證文件修改 nginx.conf 配置文件重啟服務&#xff0c;…

java向上轉型

介紹 代碼 父類 package b;public class father_ {//father classString name"動物";int age10;public void sleep() {System.out.println("睡");}public void run() {System.out.println("跑");}public void eat() {System.out.println("…