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

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

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

從場(chǎng)景切入

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

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

「簡(jiǎn)單,改成并發(fā)調(diào)用就行。」你心想。

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

寫完提測(cè),QA 說偶爾會(huì)超時(shí)。

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

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

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

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

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

傳統(tǒng)的 ExecutorServiceFuture、CompletableFuture 確實(shí)非常強(qiáng)大,但也足夠啰嗦:

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

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

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

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

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

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

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

看一個(gè)最簡(jiǎn)單的例子:

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);
    
    // 到這里,兩個(gè)任務(wù)肯定都結(jié)束了(成功、失敗或超時(shí))
    String result = user.await() + ":" + orders.await();
}
// scope 關(guān)閉時(shí),所有任務(wù)自動(dòng)取消、資源自動(dòng)清理

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

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

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

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

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

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

1. 默認(rèn)行為就是正確的

// 默認(rèn):FAIL_FAST + 30秒超時(shí) + 自動(dòng)取消其他任務(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) {
    // 超時(shí)了,所有任務(wù)已被自動(dòng)取消
    fallback();
} catch (FailurePropagationException failed) {
    // 某個(gè)任務(wù)失敗了,其他任務(wù)已被自動(dòng)取消
    handleError(failed);
}

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

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

不同場(chǎng)景對(duì)失敗的容忍度不同,ThreadForge 提供了 5 種明確的策略:

  • FAIL_FAST:快速失敗,立即取消其他任務(wù)(默認(rèn))
  • COLLECT_ALL:等所有任務(wù)結(jié)束,匯總所有失敗
  • SUPERVISOR:不自動(dòng)取消,失敗信息收集到 Outcome
  • CANCEL_OTHERS:失敗后取消其余任務(wù),但不拋異常
  • IGNORE_ALL:忽略失敗,只返回成功的結(jié)果
// 場(chǎng)景:批量導(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ā)度控制不再需要手動(dòng)管理隊(duì)列

// 場(chǎng)景:調(diào)用外部 API,最多同時(shí)50個(gè)請(qǐng)求
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);
}
// 自動(dòng)限流,不會(huì)把外部服務(wù)打爆

不需要自己寫信號(hào)量,不需要手動(dòng)分批,框架自動(dòng)處理。

4. 生命周期觀測(cè)統(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());
        }
    });

一處埋點(diǎn),全局生效。

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

5. 跨 JDK 版本的一致體驗(yàn)

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

不需要分叉代碼,不需要寫 if-else,框架自動(dòng)適配。

適用場(chǎng)景

ThreadForge 特別適合這些場(chǎng)景:

并發(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)者-消費(fèi)者模式

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% 的常見場(chǎng)景變得簡(jiǎn)單、安全、可維護(hù)。

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

    Java編程中使用lambda表達(dá)式的奇技淫巧

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

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

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

    Java容器HashMap與HashTable詳解

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

    mybatisplus?JSON類型處理器詳解

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

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

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

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

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

    解決Java異常報(bào)錯(cuò):java.nio.channels.UnresolvedAddressException問題

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

最新評(píng)論

牟定县| 佳木斯市| 青铜峡市| 辽宁省| 成安县| 玉环县| 白山市| 呼图壁县| 教育| 凤冈县| 山东省| 信宜市| 曲靖市| 阜宁县| 隆子县| 余姚市| 启东市| 兴文县| 阿尔山市| 美姑县| 共和县| 滨海县| 调兵山市| 集贤县| 焉耆| 徐闻县| 德兴市| 格尔木市| 西畴县| 开化县| 安塞县| 沙雅县| 沈丘县| 安宁市| 蒙城县| 深州市| 汝州市| 巴东县| 宜黄县| 渭南市| 年辖:市辖区|