成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CompletableFuture異步多線程是真的優(yōu)雅

開發(fā) 開發(fā)工具
CompletableFuture?是Java 8引入的一個(gè)強(qiáng)大的異步編程工具,它以一種極其優(yōu)雅的方式解決了傳統(tǒng)異步編程方式的諸多痛點(diǎn)。通過使用CompletableFuture?,我們可以更加便捷地實(shí)現(xiàn)異步多線程編程,提高代碼的可讀性和可維護(hù)性。

今天給大家介紹一個(gè)非常有意思的Java編程中的奇淫巧技——用CompletableFuture來做異步編程。

先說一下異步編程是啥,以及一般都是什么時(shí)候用他們。

其實(shí)大家比較常規(guī)習(xí)慣的都是用springboot+ssm+springcloud alibaba技術(shù)體系去開發(fā)一些web系統(tǒng),然后里面填充各種crud代碼,相信看這篇文章的朋友應(yīng)該都差不多,畢竟天下苦crud久已,進(jìn)軟件開發(fā)行業(yè)之前覺得很高大上,進(jìn)來以后發(fā)現(xiàn)技術(shù)都熟悉的差不多了,更多的都是在干crud。

那其實(shí)在這種常規(guī)性的crud類的系統(tǒng)和技術(shù)體系下,一般我們都不需要去做什么并發(fā)編程、異步編程之類的,因?yàn)橐话阆到y(tǒng)原理都是springboot拉起來一個(gè)內(nèi)嵌的web server,比如tomcat,然后對(duì)外接http請(qǐng)求,多線程并發(fā)處理請(qǐng)求,每個(gè)線程都是調(diào)用你的controller、service、dao和sql語句,是不是?

而且其實(shí)大家平時(shí)用spring的話,所有的spring bean都是做成單例的,而且單例一般都是無狀態(tài)的,就是大家不會(huì)在內(nèi)存里放什么數(shù)據(jù),也就避免了多線程并發(fā)的安全問題,然后我們平時(shí)也就不用在crud系統(tǒng)里關(guān)注多線程問題了。

所以其實(shí)我們寫的代碼都是順序流的模式,來一個(gè)請(qǐng)求,各種業(yè)務(wù)邏輯處理,調(diào)用service,dao,執(zhí)行各種sql語句,然后最后都是面向數(shù)據(jù)庫做增刪改查,所以根本沒機(jī)會(huì)也不需要使用并發(fā)編程和異步編程。

當(dāng)然這種模式在crud業(yè)務(wù)類系統(tǒng)里還是不錯(cuò)的,畢竟方便,寫業(yè)務(wù)就可以了,不要去關(guān)注復(fù)雜的多線程并發(fā)和異步化的問題。

所以并發(fā)編程和異步編程指的是什么呢?并發(fā)編程其實(shí)是指比如你寫了一個(gè)系統(tǒng),你的系統(tǒng)代碼里不是執(zhí)行那種crud順序流代碼,而是自己搞一個(gè)class,繼承Thread,自己實(shí)現(xiàn)一個(gè)線程類,然后你的系統(tǒng)代碼里拿到一個(gè)請(qǐng)求不是直接去crud,而是啟動(dòng)一個(gè)Thread線程去并發(fā)運(yùn)行起來,這個(gè)線程不就會(huì)異步的去執(zhí)行一些操作了。

雖然大家一般真的很少在業(yè)務(wù)系統(tǒng)里用這種并發(fā)編程和異步編程的模式,但是代碼里確實(shí)是可以這么玩的。

好,那一般什么時(shí)候需要在代碼里開一些線程去并發(fā)運(yùn)行,異步化的運(yùn)行呢?不幸的消息是,crud系統(tǒng)真的很少用,一般其實(shí)都是中間件類的系統(tǒng)會(huì)大量的運(yùn)用并發(fā)編程的知識(shí),各種請(qǐng)求都是異步化的執(zhí)行,比如說大家可以去看看rocketmq、elasticsearch這一類中間件的源碼,他們會(huì)經(jīng)常用到。

或者說大家在自己公司里研發(fā)一些非crud類的系統(tǒng),比如說一些公司內(nèi)自研的一些底層系統(tǒng),基礎(chǔ)系統(tǒng),中間件系統(tǒng),其實(shí)也會(huì)經(jīng)常用到并發(fā)編程,也就是異步編程的模式,那如果大家未來有可能用到異步編程的話,建議還是來了解一下今天的知識(shí)點(diǎn),因?yàn)閭鹘y(tǒng)的異步編程其實(shí)控制你開的那個(gè)線程其實(shí)真的很麻煩。

但是用了CompletableFuture之后,對(duì)你開出來的多線程并發(fā)任務(wù),你其實(shí)是可以很好的去控制他們的,一起開始今天的旅程吧。

在Java的世界里,處理異步和多線程任務(wù)一直是個(gè)讓人頭疼的問題。傳統(tǒng)的線程創(chuàng)建和管理方式,不僅代碼繁瑣,還容易出錯(cuò)。但是,自從Java 8推出了CompletableFuture這個(gè)神器,一切都變得不一樣了。它以一種極其優(yōu)雅的方式,解決了異步編程的諸多痛點(diǎn)。今天,咱們就來聊聊這個(gè)CompletableFuture,看看它到底是如何讓異步多線程編程變得如此優(yōu)雅的。

一、異步編程的痛點(diǎn)

在CompletableFuture出現(xiàn)之前,Java的異步編程主要有兩種方式:通過Future接口和實(shí)現(xiàn)Callable接口。但是,這兩種方式都存在一些問題。

1、阻塞和輪詢:使用Future.get()方法獲取異步結(jié)果時(shí),如果結(jié)果還沒有準(zhǔn)備好,當(dāng)前線程會(huì)被阻塞。為了避免阻塞,我們通常會(huì)使用輪詢的方式檢查結(jié)果是否準(zhǔn)備好,但這種方式會(huì)浪費(fèi)CPU資源。

2、無法組合多個(gè)異步任務(wù):在實(shí)際開發(fā)中,我們經(jīng)常需要組合多個(gè)異步任務(wù)的結(jié)果。但是,使用傳統(tǒng)的Future和Callable,很難實(shí)現(xiàn)復(fù)雜的異步任務(wù)組合邏輯。

3、異常處理不便:當(dāng)異步任務(wù)出現(xiàn)異常時(shí),傳統(tǒng)的處理方式是通過Future.get()方法捕獲異常,但這種方式不夠靈活,也不便于異步任務(wù)的錯(cuò)誤恢復(fù)。

二、CompletableFuture的優(yōu)雅之處

CompletableFuture是Java 8引入的一個(gè)新的異步編程工具,它解決了傳統(tǒng)異步編程方式的諸多痛點(diǎn),讓異步多線程編程變得更加優(yōu)雅和便捷。

1、非阻塞的異步結(jié)果獲取:CompletableFuture提供了非阻塞的異步結(jié)果獲取方式。你可以通過thenApply、thenAccept、thenRun等方法,在異步任務(wù)完成時(shí)執(zhí)行特定的操作,而無需阻塞當(dāng)前線程。

2、靈活的異步任務(wù)組合:CompletableFuture提供了豐富的API,支持多種異步任務(wù)的組合方式。你可以使用thenCombine、thenAcceptBoth、runAfterBoth等方法,將兩個(gè)異步任務(wù)的結(jié)果進(jìn)行組合;或者使用allOf、anyOf等方法,等待多個(gè)異步任務(wù)完成。

3、便捷的異常處理:CompletableFuture提供了exceptionally方法,用于處理異步任務(wù)中出現(xiàn)的異常。你可以在這個(gè)方法中定義異常的處理邏輯,使得異步任務(wù)的錯(cuò)誤恢復(fù)變得更加便捷。

4、鏈?zhǔn)秸{(diào)用和流式處理:CompletableFuture的方法調(diào)用支持鏈?zhǔn)讲僮鳎憧梢詫⒍鄠€(gè)異步任務(wù)串聯(lián)起來,形成一個(gè)處理流程。這種鏈?zhǔn)秸{(diào)用和流式處理的方式,使得異步編程的代碼更加簡(jiǎn)潔和易讀。

三、CompletableFuture的使用示例

下面,我們通過一些具體的示例,來看看CompletableFuture是如何優(yōu)雅地解決異步多線程編程的問題的。

示例1:異步執(zhí)行任務(wù)并獲取結(jié)果

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {  
   // 模擬異步任務(wù)  
   try {  
       Thread.sleep(1000);  
  } catch (InterruptedException e) {  
       e.printStackTrace();  
  }  
   return "Hello, CompletableFuture!";  
});  
 
// 非阻塞方式獲取結(jié)果  
future.thenAccept(System.out::println);

在這個(gè)示例中,我們使用supplyAsync方法異步執(zhí)行了一個(gè)任務(wù),并返回了一個(gè)CompletableFuture對(duì)象。然后,我們使用thenAccept方法,在異步任務(wù)完成時(shí)打印結(jié)果。這種方式避免了阻塞和輪詢,使得代碼更加簡(jiǎn)潔和高效。

示例2:組合多個(gè)異步任務(wù)的結(jié)果

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");  
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");  
 
future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2)  
      .thenAccept(System.out::println);

在這個(gè)示例中,我們使用thenCombine方法將兩個(gè)異步任務(wù)的結(jié)果進(jìn)行了組合。當(dāng)兩個(gè)異步任務(wù)都完成時(shí),它們的結(jié)果會(huì)被拼接成一個(gè)新的字符串,并打印出來。這種方式使得異步任務(wù)的組合變得更加靈活和便捷。

示例3:處理異步任務(wù)中的異常

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {  
   if (true) { // 假設(shè)這里有個(gè)條件判斷,滿足時(shí)拋出異常  
       throw new RuntimeException("Oops!");  
  }  
   return "Normal result";  
});  
 
future.exceptionally(ex -> "Fallback result")  
    .thenAccept(System.out::println);

在這個(gè)示例中,我們使用exceptionally方法處理了異步任務(wù)中出現(xiàn)的異常。當(dāng)異步任務(wù)拋出異常時(shí),我們會(huì)返回一個(gè)備用結(jié)果,并打印出來。這種方式使得異步任務(wù)的錯(cuò)誤恢復(fù)變得更加容易和可控。

四、CompletableFuture的高級(jí)特性

除了上述的基本用法外,CompletableFuture還提供了一些高級(jí)特性,進(jìn)一步增強(qiáng)了其異步編程的能力。

1、自定義線程池:默認(rèn)情況下,CompletableFuture會(huì)使用ForkJoinPool.commonPool()作為線程池來執(zhí)行異步任務(wù)。但是,你也可以通過supplyAsync、runAsync等方法的重載版本,自定義線程池來執(zhí)行異步任務(wù)。

2、完成時(shí)的回調(diào):CompletableFuture提供了whenComplete、whenCompleteAsync等方法,允許你在異步任務(wù)完成時(shí)執(zhí)行特定的回調(diào)操作。這些回調(diào)操作可以處理正常結(jié)果,也可以處理異常情況。

3、結(jié)果計(jì)算完成時(shí)的通知:CompletableFuture還提供了thenRun方法,允許你在異步任務(wù)的結(jié)果計(jì)算完成時(shí)執(zhí)行特定的操作。這個(gè)方法不關(guān)心異步任務(wù)的結(jié)果,只關(guān)心任務(wù)是否完成。

4、等待多個(gè)異步任務(wù)完成:CompletableFuture提供了allOf、anyOf等靜態(tài)方法,用于等待多個(gè)異步任務(wù)完成。allOf會(huì)等待所有任務(wù)完成,而anyOf則只等待其中一個(gè)任務(wù)完成。

五、總結(jié)

CompletableFuture是Java 8引入的一個(gè)強(qiáng)大的異步編程工具,它以一種極其優(yōu)雅的方式解決了傳統(tǒng)異步編程方式的諸多痛點(diǎn)。通過使用CompletableFuture,我們可以更加便捷地實(shí)現(xiàn)異步多線程編程,提高代碼的可讀性和可維護(hù)性。同時(shí),CompletableFuture還提供了豐富的高級(jí)特性,進(jìn)一步增強(qiáng)了其異步編程的能力。因此,如果你還在為異步多線程編程而苦惱,不妨嘗試一下CompletableFuture,相信它會(huì)給你帶來全新的編程體驗(yàn)。

責(zé)任編輯:武曉燕 來源: 石杉的架構(gòu)筆記
相關(guān)推薦

2020-11-09 09:33:37

多線程

2021-06-06 16:56:49

異步編程Completable

2023-06-13 13:39:00

多線程異步編程

2023-05-12 14:14:00

Java線程中斷

2024-10-28 13:31:33

性能@Async應(yīng)用

2024-12-26 12:59:39

2022-08-19 08:39:34

OrderMySql數(shù)據(jù)庫

2025-06-10 07:15:18

Java 8重構(gòu)設(shè)計(jì)模式

2020-11-09 14:30:28

Linux多線程數(shù)據(jù)

2022-11-27 08:12:11

RocketMQ源碼工具類

2021-02-21 14:35:29

Java 8異步編程

2015-06-16 11:06:42

JavaCompletable

2025-02-07 10:14:36

2021-06-11 11:28:22

多線程fork單線程

2022-07-08 14:14:04

并發(fā)編程異步編程

2024-04-18 08:20:27

Java 8編程工具

2020-09-03 06:42:12

線程安全CPU

2024-11-25 13:49:00

2023-02-20 15:29:46

異步編碼多線程

2024-10-14 11:08:53

程序異常延遲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91免费观看| 一区二区三区视频在线 | 亚洲国产成人av好男人在线观看 | 国产精品免费一区二区三区四区 | 成人在线观看免费 | 成人免费视频7777777 | 日产精品久久久一区二区福利 | 91免费高清视频 | 天堂网中文字幕在线观看 | 亚洲一区二区视频在线播放 | 久久69精品久久久久久国产越南 | 欧美三级在线 | 欧美另类视频 | 美女国内精品自产拍在线播放 | 国产成人99久久亚洲综合精品 | 欧美a在线看 | 国产免费av网 | 黄色网址av | 免费成人在线网站 | 成人国产精品入口免费视频 | 91精品国产乱码久久蜜臀 | 亚洲天堂免费 | 欧美黄色网 | 久草视频观看 | 91福利在线导航 | 91精品国产99久久 | 欧美日韩国产欧美 | 日本小电影网站 | 色婷婷婷婷色 | 精品国产乱码久久久久久蜜臀 | 91久久国产精品 | 国产黄色网 | 欧美视频在线播放 | 欧美一级特黄aaa大片在线观看 | 亚洲一区中文 | 日韩av在线一区二区三区 | 精品国产18久久久久久二百 | 国产xxx在线观看 | 欧美国产亚洲一区二区 | 亚洲电影第三页 | 国内精品视频一区二区三区 |