最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDK8 中線程實(shí)現(xiàn)方法與底層邏輯深度解析

 更新時(shí)間:2025年12月22日 15:54:13   作者:樂(lè)觀甜甜圈  
JDK8提供了多種線程實(shí)現(xiàn)方式,包括繼承Thread類、實(shí)現(xiàn)Runnable接口和Callable接口,還介紹了線程池的實(shí)現(xiàn)和JDK8新增特性CompletableFuture,底層線程模型包括JVM線程與操作系統(tǒng)線程的關(guān)系、線程狀態(tài)轉(zhuǎn)換以及創(chuàng)建與銷毀的開銷,感興趣的朋友跟隨小編一起看看吧

一、引言

在 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)文章

  • 老生常談Log4j和Log4j2的區(qū)別(推薦)

    老生常談Log4j和Log4j2的區(qū)別(推薦)

    下面小編就為大家?guī)?lái)老生常談Log4j和Log4j2的區(qū)別(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Java利用數(shù)組隨機(jī)抽取幸運(yùn)觀眾如何實(shí)現(xià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)題

    這篇文章主要介紹了解決feign調(diào)用接口不穩(wěn)定的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 基于Process#waitFor()阻塞問(wèn)題的解決

    基于Process#waitFor()阻塞問(wèn)題的解決

    這篇文章主要介紹了Process#waitFor()阻塞問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring?Boot父子工程POM依賴關(guān)系舉例詳解

    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
  • 使用linux部署Spring Boot程序

    使用linux部署Spring Boot程序

    springboot程序在linux服務(wù)器上應(yīng)該怎么部署?這次就分享下linux下如何正確部署springboot程序,感興趣的朋友一起看看吧
    2018-01-01
  • Java?Api實(shí)現(xiàn)Elasticsearch的滾動(dòng)查詢功能

    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
  • java必學(xué)必會(huì)之GUI編程

    java必學(xué)必會(huì)之GUI編程

    這篇文章主要為大家詳細(xì)介紹了java GUI編程,對(duì)于GUI編程小編也不是很了解,通過(guò)這篇文章和大家一起學(xué)習(xí)GUI編程,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 面試初級(jí)Java開發(fā)問(wèn)到Arrays

    面試初級(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)系

    這篇文章主要介紹了關(guān)于@Autowired注解和靜態(tài)方法及new的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論

汨罗市| 泾阳县| 洞口县| 天峨县| 龙江县| 和硕县| 称多县| 徐闻县| 喜德县| 延长县| 无为县| 尉氏县| 思茅市| 泊头市| 进贤县| 饶平县| 渭源县| 双城市| 武宣县| 凤冈县| 安西县| 东安县| 禄劝| 芦山县| 宜良县| 安平县| 南京市| 南京市| 密云县| 东明县| 阳新县| 沛县| 靖远县| 双鸭山市| 江油市| 思南县| 布拖县| 泰兴市| 怀远县| 望都县| 黄山市|