JDK8 中線程實(shí)現(xiàn)方法與底層邏輯深度解析
一、引言
在 Java 并發(fā)編程中,線程是最基礎(chǔ)的執(zhí)行單元。JDK8 提供了多種創(chuàng)建和管理線程的方式,每種方式都有其特定的使用場(chǎng)景和底層實(shí)現(xiàn)機(jī)制。本文將全面解析 JDK8 中實(shí)現(xiàn)線程的方法及其底層邏輯。
二、線程實(shí)現(xiàn)的三種核心方式
1. 繼承 Thread 類
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("線程執(zhí)行: " + Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 啟動(dòng)線程
}
}底層邏輯:
- Thread 類本身實(shí)現(xiàn)了 Runnable 接口
- JVM 調(diào)用
start()方法后,會(huì)在底層創(chuàng)建真正的操作系統(tǒng)線程 start()方法通過(guò) JNI(Java Native Interface)調(diào)用操作系統(tǒng)原生線程創(chuàng)建 API- 線程創(chuàng)建完成后,JVM 調(diào)度執(zhí)行
run()方法
2. 實(shí)現(xiàn) Runnable 接口(推薦方式)
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable執(zhí)行: " + Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}底層邏輯:
- Runnable 是函數(shù)式接口,只定義
run()方法 - Thread 類接收 Runnable 實(shí)例作為執(zhí)行目標(biāo)
- 避免了 Java 單繼承的限制,更加靈活
- 符合面向?qū)ο笤O(shè)計(jì)原則:組合優(yōu)于繼承
3. 實(shí)現(xiàn) Callable 接口
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Callable執(zhí)行結(jié)果: " + Thread.currentThread().getName();
}
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new MyCallable());
System.out.println(future.get()); // 獲取返回值
executor.shutdown();
}
}底層邏輯:
- Callable 允許返回結(jié)果和拋出異常
- 通過(guò) FutureTask 包裝,實(shí)現(xiàn) RunnableFuture 接口
- ExecutorService 提交任務(wù)時(shí),內(nèi)部創(chuàng)建 FutureTask
- 任務(wù)執(zhí)行結(jié)果通過(guò) Future 對(duì)象獲取,支持異步編程模型
三、線程池的實(shí)現(xiàn)(Executor Framework)
核心線程池類型
// 1. 固定大小線程池 ExecutorService fixedPool = Executors.newFixedThreadPool(5); // 2. 緩存線程池 ExecutorService cachedPool = Executors.newCachedThreadPool(); // 3. 單線程池 ExecutorService singlePool = Executors.newSingleThreadExecutor(); // 4. 調(diào)度線程池 ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(3);
ThreadPoolExecutor 核心原理
public ThreadPoolExecutor(
int corePoolSize, // 核心線程數(shù)
int maximumPoolSize, // 最大線程數(shù)
long keepAliveTime, // 空閑線程存活時(shí)間
TimeUnit unit, // 時(shí)間單位
BlockingQueue<Runnable> workQueue, // 工作隊(duì)列
ThreadFactory threadFactory, // 線程工廠
RejectedExecutionHandler handler // 拒絕策略
)工作流程示意圖:
提交任務(wù) → 核心線程是否滿? → 否 → 創(chuàng)建核心線程執(zhí)行
↓是
工作隊(duì)列是否滿? → 否 → 加入隊(duì)列等待
↓是
最大線程是否滿? → 否 → 創(chuàng)建臨時(shí)線程
↓是
執(zhí)行拒絕策略底層數(shù)據(jù)結(jié)構(gòu):
- Worker 內(nèi)部類:包裝線程和任務(wù)
- BlockingQueue:存儲(chǔ)待執(zhí)行任務(wù)(ArrayBlockingQueue、LinkedBlockingQueue 等)
- AtomicInteger:使用 CAS 操作維護(hù)線程池狀態(tài)和線程數(shù)
四、JDK8 新增特性:CompletableFuture
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("異步執(zhí)行: " + Thread.currentThread().getName());
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
return "異步計(jì)算結(jié)果";
});底層邏輯:
- 基于 ForkJoinPool.commonPool() 或自定義線程池
- 實(shí)現(xiàn) CompletionStage 接口,支持流式編程
- 內(nèi)部使用 Completion 鏈表管理依賴關(guān)系
- 提供豐富的組合操作(thenApply、thenAccept、thenCombine 等)
五、底層線程模型詳解
1. JVM 線程與操作系統(tǒng)線程關(guān)系
Java Thread → JVM Thread → pthread(Linux)/ Windows Thread → CPU 調(diào)度
- 1:1 模型:每個(gè) Java 線程對(duì)應(yīng)一個(gè)操作系統(tǒng)原生線程
- 綠色線程(Green Threads):早期 JVM 使用的用戶態(tài)線程,已棄用
- 線程棧:每個(gè)線程擁有獨(dú)立的??臻g(默認(rèn) 1MB,可通過(guò)
-Xss調(diào)整)
2. 線程狀態(tài)轉(zhuǎn)換
public enum State {
NEW, // 新建
RUNNABLE, // 可運(yùn)行(包括就緒和運(yùn)行)
BLOCKED, // 阻塞(等待監(jiān)視器鎖)
WAITING, // 等待(無(wú)限期等待)
TIMED_WAITING, // 超時(shí)等待
TERMINATED // 終止
}狀態(tài)轉(zhuǎn)換圖:
NEW --start()--> RUNNABLE RUNNABLE --獲取鎖失敗--> BLOCKED RUNNABLE --wait()/join()--> WAITING RUNNABLE --sleep(n)/wait(n)--> TIMED_WAITING 各種狀態(tài) --執(zhí)行完畢/異常--> TERMINATED
3. 線程創(chuàng)建與銷毀開銷
創(chuàng)建開銷:
- 分配線程棧內(nèi)存(1MB 默認(rèn))
- 系統(tǒng)調(diào)用創(chuàng)建原生線程
- 初始化線程本地存儲(chǔ)(ThreadLocal)
優(yōu)化建議:
- 使用線程池復(fù)用線程
- 合理設(shè)置線程棧大小
- 避免頻繁創(chuàng)建銷毀線程
到此這篇關(guān)于JDK8 中線程實(shí)現(xiàn)方法與底層邏輯深度解析的文章就介紹到這了,更多相關(guān)jdk線程實(shí)現(xiàn)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用數(shù)組隨機(jī)抽取幸運(yùn)觀眾如何實(shí)現(xiàn)
這篇文章主要介紹了Java利用數(shù)組隨機(jī)抽取幸運(yùn)觀眾如何實(shí)現(xiàn),需要的朋友可以參考下2014-02-02
解決feign調(diào)用接口不穩(wěn)定的問(wèn)題
這篇文章主要介紹了解決feign調(diào)用接口不穩(wěn)定的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
基于Process#waitFor()阻塞問(wèn)題的解決
這篇文章主要介紹了Process#waitFor()阻塞問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring?Boot父子工程POM依賴關(guān)系舉例詳解
這篇文章主要介紹了Spring?Boot父子工程POM依賴關(guān)系的相關(guān)資料,Spring Boot父子工程通過(guò)Maven繼承機(jī)制實(shí)現(xiàn)統(tǒng)一版本、依賴和插件管理,模塊化開發(fā)與代碼復(fù)用,提升項(xiàng)目可維護(hù)性與效率,需要的朋友可以參考下2025-08-08
Java?Api實(shí)現(xiàn)Elasticsearch的滾動(dòng)查詢功能
這篇文章主要介紹了Java?Api實(shí)現(xiàn)Elasticsearch的滾動(dòng)查詢,解決ES每次只能查詢一萬(wàn)條數(shù)據(jù)的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
面試初級(jí)Java開發(fā)問(wèn)到Arrays
這篇文章主要介紹了Java Arrays工具類用法,結(jié)合實(shí)例形式分析了java Arrays工具類針對(duì)數(shù)組元素修改、復(fù)制、排序等操作使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2021-07-07
關(guān)于@Autowired注解和靜態(tài)方法及new的關(guān)系
這篇文章主要介紹了關(guān)于@Autowired注解和靜態(tài)方法及new的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

