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

Java多線程ThreadForge的實現(xiàn)

 更新時間:2026年05月21日 08:18:12   作者:一只叫煤球的貓  
本文主要介紹了Java多線程ThreadForge的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

從場景切入

產(chǎn)品說:「用戶詳情頁太慢了,能不能優(yōu)化一下?」

你一看代碼,三個接口串行調(diào)用:先查用戶信息,再查訂單列表,最后查積分余額。每個接口 200ms,加起來 600ms。

「簡單,改成并發(fā)調(diào)用就行?!鼓阈南?。

于是你創(chuàng)建了一個線程池,用 Future 提交了三個任務(wù)。

寫完提測,QA 說偶爾會超時。

你加了個 future.get(500, MILLISECONDS)

又過了幾天,測試環(huán)境出現(xiàn)了線程泄漏,你趕緊補了個 finally { executor.shutdown() }。

上線前,tech lead 問:「如果用戶服務(wù)掛了,另外兩個任務(wù)會取消嗎?」你愣了一下,又加了一堆 cancel 邏輯和異常處理。

這時候你發(fā)現(xiàn),一個簡單的「并發(fā)調(diào)用三個接口」,代碼已經(jīng)寫了 50 多行。

并且下次遇到類似場景,還得把這些邏輯再寫一遍:超時、取消、異常傳播、資源清理……每次都要重新思考一遍邊界條件。

傳統(tǒng)的 ExecutorService、Future、CompletableFuture 確實非常強大,但也足夠啰嗦:

  • 線程池要手動創(chuàng)建和關(guān)閉
  • 超時邏輯每個任務(wù)都要寫一遍
  • 失敗了要不要取消其他任務(wù)?得自己判斷
  • 異常怎么傳播?要么吞掉,要么手動包裝
  • 想知道任務(wù)跑了多久?自己打日志

某一天,我猛然驚醒:寫并發(fā)代碼,不應(yīng)該這么費腦子。

ThreadForge:把復(fù)雜度收斂到一個可推理的模型里

ThreadForge 的設(shè)計哲學(xué)很簡單:先降低認知成本,再追求性能。

可以把它理解成一個結(jié)構(gòu)化并發(fā)框架——讓你用寫同步代碼的思維寫并發(fā)代碼,同時自動處理那些容易遺漏的邊界情況。

也可以把它理解成對于 Java 內(nèi)置并發(fā)工具的二次包裝,目標(biāo)是讓Java并發(fā)更簡單、更清晰。

什么是結(jié)構(gòu)化?

看一個最簡單的例子:

try (ThreadScope scope = ThreadScope.open()) {
    Task<String> user = scope.submit("load-user", () -> fetchUser());
    Task<Integer> orders = scope.submit("load-orders", () -> fetchOrders());
    
    scope.await(user, orders);
    
    // 到這里,兩個任務(wù)肯定都結(jié)束了(成功、失敗或超時)
    String result = user.await() + ":" + orders.await();
}
// scope 關(guān)閉時,所有任務(wù)自動取消、資源自動清理

這段代碼有幾個關(guān)鍵點:

  1. 所有任務(wù)都綁定在 ThreadScope 內(nèi),生命周期有邊界,不會泄漏
  2. 默認就是安全的:默認超時、默認失敗傳播、自動取消
  3. 代碼結(jié)構(gòu)就是任務(wù)關(guān)系:讀代碼的人一眼就能看出兩個任務(wù)是并發(fā)的,且必須都完成才能繼續(xù)

對比傳統(tǒng)寫法,你需要:

  • 創(chuàng)建線程池,配置核心線程數(shù)、隊列大小
  • 提交任務(wù),手動處理 Future
  • 寫 try-finally 確保 shutdown
  • 手動處理超時和異常傳播

ThreadForge 讓你省掉這些重復(fù)勞動,專注業(yè)務(wù)邏輯。

五個讓你省腦力的設(shè)計

1. 默認行為就是正確的

// 默認:FAIL_FAST + 30秒超時 + 自動取消其他任務(wù)
try (ThreadScope scope = ThreadScope.open()) {
    Task<Integer> a = scope.submit(() -> riskyRpc());
    Task<Integer> b = scope.submit(() -> anotherRpc());
    scope.await(a, b);
} catch (ScopeTimeoutException timeout) {
    // 超時了,所有任務(wù)已被自動取消
    fallback();
} catch (FailurePropagationException failed) {
    // 某個任務(wù)失敗了,其他任務(wù)已被自動取消
    handleError(failed);
}

不需要配置,不需要思考,開箱即用。

2. 失敗策略明確且統(tǒng)一

不同場景對失敗的容忍度不同,ThreadForge 提供了 5 種明確的策略:

  • FAIL_FAST:快速失敗,立即取消其他任務(wù)(默認)
  • COLLECT_ALL:等所有任務(wù)結(jié)束,匯總所有失敗
  • SUPERVISOR:不自動取消,失敗信息收集到 Outcome
  • CANCEL_OTHERS:失敗后取消其余任務(wù),但不拋異常
  • IGNORE_ALL:忽略失敗,只返回成功的結(jié)果
// 場景:批量導(dǎo)入,即使部分失敗也要知道哪些成功了
try (ThreadScope scope = ThreadScope.open()
        .withFailurePolicy(FailurePolicy.SUPERVISOR)) {
    
    List<Task<Void>> tasks = ids.stream()
        .map(id -> scope.submit(() -> importData(id)))
        .collect(toList());
    
    Outcome outcome = scope.await(tasks);
    
    // 明確知道哪些成功、哪些失敗
    log.info("成功: {}, 失敗: {}", 
        outcome.successCount(), outcome.failureCount());
}

3. 并發(fā)度控制不再需要手動管理隊列

// 場景:調(diào)用外部 API,最多同時50個請求
try (ThreadScope scope = ThreadScope.open()
        .withConcurrencyLimit(50)) {
    
    List<Task<Result>> tasks = hugeIdList.stream()
        .map(id -> scope.submit(() -> externalApi.call(id)))
        .collect(toList());
    
    List<Result> results = scope.awaitAll(tasks);
}
// 自動限流,不會把外部服務(wù)打爆

不需要自己寫信號量,不需要手動分批,框架自動處理。

4. 生命周期觀測統(tǒng)一收口

ThreadScope scope = ThreadScope.open()
    .withHook(new ThreadHook() {
        @Override
        public void onStart(TaskInfo info) {
            metrics.taskStarted(info.name());
        }
        
        @Override
        public void onSuccess(TaskInfo info, Duration duration) {
            metrics.taskSuccess(info.name(), duration.toMillis());
        }
        
        @Override
        public void onFailure(TaskInfo info, Throwable error, Duration duration) {
            log.error("Task {} failed after {}", info.name(), duration, error);
            metrics.taskFailed(info.name());
        }
    });

一處埋點,全局生效。

不需要在每個任務(wù)里重復(fù)寫日志和監(jiān)控代碼。

5. 跨 JDK 版本的一致體驗

// 同一套 API
try (ThreadScope scope = ThreadScope.open()) {
    // JDK 21+: 自動使用虛擬線程
    // JDK 8-20: 自動降級到線程池
    Task<String> task = scope.submit(() -> longRunningTask());
    return task.await();
}

不需要分叉代碼,不需要寫 if-else,框架自動適配。

適用場景

ThreadForge 特別適合這些場景:

并發(fā) RPC 聚合

try (ThreadScope scope = ThreadScope.open()) {
    Task<User> user = scope.submit(() -> userService.get(uid));
    Task<List<Order>> orders = scope.submit(() -> orderService.list(uid));
    Task<Profile> profile = scope.submit(() -> profileService.get(uid));
    
    scope.await(user, orders, profile);
    
    return buildResponse(user.await(), orders.await(), profile.await());
}

批量數(shù)據(jù)處理

try (ThreadScope scope = ThreadScope.open()
        .withConcurrencyLimit(100)
        .withDeadline(Duration.ofMinutes(5))) {
    
    List<Task<Void>> tasks = records.stream()
        .map(r -> scope.submit(() -> process(r)))
        .collect(toList());
    
    scope.awaitAll(tasks);
}

生產(chǎn)者-消費者模式

try (ThreadScope scope = ThreadScope.open()) {
    Channel<Data> channel = Channel.bounded(1000);
    
    scope.submit(() -> {
        for (Data d : datasource) {
            channel.send(d);
        }
        channel.close();
        return null;
    });
    
    List<Task<Void>> consumers = IntStream.range(0, 4)
        .mapToObj(i -> scope.submit(() -> {
            for (Data d : channel) {
                process(d);
            }
            return null;
        }))
        .collect(toList());
    
    scope.awaitAll(consumers);
}

開始使用

Maven:

<dependency>
    <groupId>pub.lighting</groupId>
    <artifactId>threadforge-core</artifactId>
    <version>1.0.1</version>
</dependency>

Gradle:

implementation("pub.lighting:threadforge-core:1.0.1")

最小示例:

try (ThreadScope scope = ThreadScope.open()) {
    Task<String> task = scope.submit(() -> "Hello, ThreadForge");
    System.out.println(task.await());
}

寫在最后

ThreadForge 的目標(biāo)不是取代所有并發(fā)工具,而是讓 80% 的常見場景變得簡單、安全、可維護。

當(dāng)你還在調(diào)試并發(fā)問題時,當(dāng)新人看不懂老代碼里的線程邏輯時,當(dāng)你想加個超時卻不知道從哪兒改起時——不妨試試 ThreadForge。

讓并發(fā)回歸簡單,讓代碼重新可讀。

到此這篇關(guān)于Java多線程ThreadForge的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java ThreadForge內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java微信公眾平臺開發(fā)(4) 回復(fù)消息的分類及實體的創(chuàng)建

    Java微信公眾平臺開發(fā)(4) 回復(fù)消息的分類及實體的創(chuàng)建

    這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第四步,回復(fù)消息的分類及實體的創(chuàng)建,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java的Struts框架中登陸功能的實現(xiàn)和表單處理器的使用

    Java的Struts框架中登陸功能的實現(xiàn)和表單處理器的使用

    這篇文章主要介紹了Java的Struts框架中登陸功能的實現(xiàn)和表單處理器的使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • MyBatis查詢、新增、更新與刪除操作指南

    MyBatis查詢、新增、更新與刪除操作指南

    這篇文章主要給大家介紹了關(guān)于MyBatis查詢、新增、更新與刪除操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java編程中使用lambda表達式的奇技淫巧

    Java編程中使用lambda表達式的奇技淫巧

    這篇文章主要介紹了Java編程中使用lambda表達式的奇技淫巧,使用Lambda表達式可以替代只有一個函數(shù)的接口實現(xiàn),告別匿名內(nèi)部類,代碼看起來更簡潔易懂,是Java8開始推出的人們期待已久的功能,需要的朋友可以參考下
    2016-03-03
  • SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn)

    SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn)

    本文主要介紹了SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java容器HashMap與HashTable詳解

    Java容器HashMap與HashTable詳解

    本文主要介紹HashMap 和 Hashtable的工作原理和使用方法,有興趣的朋友可以參考
    2017-04-04
  • mybatisplus?JSON類型處理器詳解

    mybatisplus?JSON類型處理器詳解

    文章介紹了如何在數(shù)據(jù)庫中使用JSON字段類型及其在Java項目中的自動轉(zhuǎn)換處理,通過設(shè)置實體類屬性上的注解,使用JacksonTypeHandler自動處理JSON數(shù)據(jù)的保存和讀取,減少手動轉(zhuǎn)換JSON與String格式的需求,這樣可以提高數(shù)據(jù)操作的效率和代碼的簡潔性
    2025-10-10
  • 淺談java 單例模式DCL的缺陷及單例的正確寫法

    淺談java 單例模式DCL的缺陷及單例的正確寫法

    這篇文章主要介紹了淺談java 單例模式DCL的缺陷及單例的正確寫法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java多線程優(yōu)化方法及使用方式

    Java多線程優(yōu)化方法及使用方式

    這篇文章主要介紹了Java多線程優(yōu)化方法及使用方式,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 解決Java異常報錯:java.nio.channels.UnresolvedAddressException問題

    解決Java異常報錯:java.nio.channels.UnresolvedAddressException問題

    這篇文章主要介紹了解決Java異常報錯:java.nio.channels.UnresolvedAddressException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05

最新評論

遵化市| 勐海县| 法库县| 文成县| 南阳市| 泰兴市| 台北县| 南平市| 中卫市| 德江县| 台前县| 莱州市| 繁昌县| 香港 | 临邑县| 南阳市| 德保县| 手机| 莱阳市| 阿尔山市| 长丰县| 甘谷县| 福安市| 郸城县| 黎城县| 保靖县| 成都市| 秦皇岛市| 罗定市| 库车县| 黄石市| 嵊泗县| 黄龙县| 大洼县| 靖宇县| 沛县| 昭平县| 大方县| 城步| 周宁县| 龙江县|