Java中創(chuàng)建線程的四種方式的最佳實踐
一句話結(jié)論
能不用 new Thread() 就別直接用;企業(yè)級項目首選線程池,避免資源耗盡與管理混亂。
一、方式一:繼承 Thread 類
示例
class MyThread extends Thread {
@Override
public void run() {
System.out.println("任務執(zhí)行:" + Thread.currentThread().getName());
}
}
public class Demo {
public static void main(String[] args) {
new MyThread().start();
}
}
特點
優(yōu)點:實現(xiàn)簡單,直接繼承并重寫 run() 方法。
缺點:
- Java 單繼承限制,無法再繼承其他類。
- 任務和線程強耦合,任務不能復用。
- 線程創(chuàng)建和銷毀開銷大。
結(jié)論:只適合入門學習,生產(chǎn)代碼中幾乎不用。
二、方式二:實現(xiàn) Runnable 接口
示例
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("任務執(zhí)行:" + Thread.currentThread().getName());
}
}
public class Demo {
public static void main(String[] args) {
new Thread(new MyRunnable()).start();
}
}
特點
優(yōu)點:
- 任務與線程解耦,可以復用
Runnable對象。 - 避免單繼承限制,更靈活。
缺點:
run() 無返回值,無法獲取執(zhí)行結(jié)果。
結(jié)論:實際項目常用,但當需要返回值或異常處理時局限性明顯。
三、方式三:實現(xiàn) Callable 接口 + Future
示例
import java.util.concurrent.*;
class MyCallable implements Callable<Integer> {
@Override
public Integer call() {
return 42;
}
}
public class Demo {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(new MyCallable());
System.out.println("結(jié)果:" + future.get());
executor.shutdown();
}
}
特點
優(yōu)點:
call()方法有返回值,可以拋出異常。- 搭配
Future、CompletableFuture支持異步編排。
缺點:
相比 Runnable 更復雜,需要 ExecutorService 配合。
結(jié)論:適合需要獲取結(jié)果或異常處理的異步任務。
四、方式四:使用線程池(Executor 框架)
示例
ExecutorService pool = Executors.newFixedThreadPool(4);
for (int i = 0; i < 5; i++) {
pool.execute(() -> System.out.println(Thread.currentThread().getName() + " 執(zhí)行任務"));
}
pool.shutdown();
特點
優(yōu)點:
- 資源復用:避免頻繁創(chuàng)建/銷毀線程。
- 任務調(diào)度:隊列 + 拒絕策略,適合高并發(fā)場景。
- 靈活擴展:可自定義核心線程數(shù)、最大線程數(shù)、存活時間、隊列。
缺點:
- 使用不當可能導致隊列堆積、拒絕任務或 OOM。
- 需配合監(jiān)控與合理參數(shù)配置。
結(jié)論:企業(yè)級項目首選,尤其是高并發(fā)系統(tǒng)。
五、四種方式對比表
| 方式 | 返回值 | 靈活性 | 使用難度 | 適用場景 |
|---|---|---|---|---|
| 繼承 Thread | 無 | 低 | 簡單 | 學習/測試 |
| Runnable | 無 | 中 | 簡單 | 一次性異步任務 |
| Callable + Future | 有 | 高 | 中等 | 需要結(jié)果/異常處理 |
| 線程池 | 可選(Future) | 很高 | 較高 | 生產(chǎn)環(huán)境標準方案 |
六、工程實踐建議
禁止直接 new Thread,無法控制線程數(shù)量,容易耗盡資源。
避免 Executors 提供的快捷工廠方法(如 newFixedThreadPool),因其參數(shù)不透明,可能造成隱患。推薦顯式使用 ThreadPoolExecutor 構(gòu)造函數(shù),明確核心參數(shù)與拒絕策略。
推薦使用 Callable + 線程池,既能拿到返回值,也能進行任務調(diào)度與統(tǒng)一管理。
務必優(yōu)雅關閉線程池,否則可能引發(fā)內(nèi)存泄漏或服務無法退出。
七、小結(jié)
- 繼承 Thread:入門。
- Runnable:任務解耦,輕量。
- Callable:有返回值,實用。
- 線程池:工程實踐必選,結(jié)合
Future/CompletableFuture更強大。
到此這篇關于Java中創(chuàng)建線程的四種方式的最佳實踐的文章就介紹到這了,更多相關Java創(chuàng)建線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Knife4j?3.0.3?整合SpringBoot?2.6.4的詳細過程
本文要講的是?Knife4j?3.0.3?整合SpringBoot?2.6.4,在SpringBoot?2.4以上的版本和之前的版本還是不一樣的,這個也容易導致一些問題,本文就這兩個版本的整合做一個實戰(zhàn)介紹2022-09-09
springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConver
解決IDEA的maven項目中沒有新建Servlet文件的選項問題

