CompletableFuture工具類使用

CompletableFuture工具類可以幫助實現Java并發編程中的任務編排

以上除了join用于阻塞調用該方法的線程并且接受CompletableFuture的返回值以外其它方法皆有Async異步和Executor指定線程池選項

對于supply,run,apply,accept的區別在于函數式編程的接口類型不同:

  • supply: Supplier<T> supplier =>?T get()
  • run:??Runnable runnable => void run()
  • apply:??Function<T, R> =>?apply(T t)
  • accept:?Consumer<T> =>?void accept(T t)

對于以上方法,根據接受參數不同分為兩類,一類參數接受如supply,run,apply,accept接口的實現類,另一類參數接受新的CompletableFuture:

FunctionInterfaceCompletableFuture
supplyAsyncthenCompose??
runAsyncthenCombine?
thenApplythenAcceptBoth
thenAcceptrunAfterBoth
thenRunapplyToEither
acceptEither
runAfterEither

thenCompose用于先執行A再執行B

thenCombine,thenAcceptBoth,runAfterBoth用于A,B同時執行

applyToEither,acceptEither,runAfterEither用于A,B誰先執行完就跳到C

?exceptionally,handle,whenComplete用于在并發編程中處理結果和異常:

exceptionally:

該方法僅處理異常情況:發生異常時,不會把異常拋出,而是由exceptionally處理結果返回

public static CompletableFuture exceptionally(int a, int b){return CompletableFuture.supplyAsync(() -> a/b).exceptionally(ex -> {System.out.println("ex:\t"+ex.getMessage());return 0;});
}

handle:

處理上一階段返回值和異常,不會把異常拋出,而是由handle處理結果返回

public class CreateThread_FutureTask {public static void main(String[] args) {CompletableFuture<String> ctf = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(1000);return "1";} catch (InterruptedException e) {throw new RuntimeException(e);}}).applyToEither(CompletableFuture.supplyAsync(() -> {try {Thread.sleep(50);return String.valueOf(1/0);} catch (InterruptedException e) {throw new RuntimeException(e);}}), str -> {return str;}).handle((str,ex)->{if(ex!=null){return ex.getMessage();}else{return str;}});System.out.println(ctf.join());System.out.println("主線程能繼續執行");}
}

whenComplete:

處理上一階段返回值和異常,會把異常拋出

public static CompletableFuture whenComplete(int a, int b){return CompletableFuture.supplyAsync(() -> a/b).whenComplete((result, ex) -> {if (null != ex) {System.out.println("whenComplete error:\t"+ex.getMessage());}});
}

CompletableFuture.allOf和anyOf

allOf:接受CompletableFuture<?>...ctfs,等待全部執行完畢

anyOf:接受CompletableFuture<?>...ctfs,等待任意一個執行完畢

CompletableFuture[] dishes = IntStream.rangeClosed(1, 10).mapToObj(i -> new Dish("菜" + i, 1L)).map(dish -> CompletableFuture.runAsync(dish::make)).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(dishes).join();
System.out.println("菜全都做好了");

使用@Async指定線程池+CompletableFuture.completedFuture實現異步

CompletableFuture.completedFuture用于在已經知道返回值時生成CompletableFuture對象,直接使用當前方法的線程,可以與SpringBoot的@Async配合實現異步

@Configuration
public class ExecutorConfig {@Beanpublic Executor myAsyncTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(500);executor.setThreadNamePrefix("GithubLookup-");executor.initialize();return executor;}
}
@Async("myAsyncTaskExecutor")
@Override
public CompletableFuture<String> completeTask(int i) throws InterruptedException {log.info("當前線程為",Thread.currentThread().getName());Thread.sleep(1000*i);String value=String.valueOf(i);return CompletableFuture.completedFuture(value);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42732.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42732.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42732.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tk 文本生成器

import random import tkinter as tk import ttkbootstrap as ttk from tkinter import messagebox import pyperclipdef wenben_run():def generate_text(original_text, length):# 去掉原始文本中的換行符和空格original_text original_text.replace(\n, )original_text or…

LLM生成的CUDA CUPTI Metrics for Capability 7.0解釋

LLM生成的CUDA CUPTI Metrics for Capability 7.0解釋 1.原文 2.6.1.3. Metrics for Capability 7.0 2.system_prompt 你是一位GPU專家,請詳細解釋用戶輸入GPU Metric的功能以及如何結合這個指標來優化Kernel的性能,要求專業術語用英文,其它用中文3.輸出 achieved_occupanc…

提升網絡包容性:探索Webkit的訪問性特性

在數字化時代&#xff0c;網絡的無障礙訪問性&#xff08;Accessibility&#xff09;對于確保每個人都能平等地訪問和使用網絡內容至關重要。Webkit&#xff0c;作為多個流行瀏覽器的核心渲染引擎&#xff0c;提供了一系列的訪問性特性&#xff0c;以支持殘障用戶更好地瀏覽網頁…

Windows11配置WSL2支持代理上網

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、安裝WSL2分發版二、配置步驟三、測試總結 前言 說起來本來這個功能我也不需要的&#xff0c;只是最近突然有個需求就順便研究了下&#xff0c;WSL2默認的網…

大模型/NLP/算法面試題總結1——大語言模型有哪些//泛化能力

1、了解哪些大語言模型&#xff1f; 1. GPT系列 GPT-3&#xff1a;由OpenAI開發&#xff0c;具有1750億個參數&#xff0c;是迄今為止最強大的自然語言處理模型之一。GPT-3能夠生成連貫的文本&#xff0c;涵蓋多種文體&#xff0c;如詩歌、小說、新聞報道、代碼等。然而&#…

北京大學長安汽車發布毫米波與相機融合模型RCBEVDet:最快能達到每秒28幀

Abstract 三維目標檢測是自動駕駛中的關鍵任務之一。為了在實際應用中降低成本&#xff0c;提出了利用低成本的多視角相機進行3D目標檢測&#xff0c;以取代昂貴的LiDAR傳感器。然而&#xff0c;僅依靠相機很難實現高精度和魯棒性的3D目標檢測。解決這一問題的有效方法是將多視…

C++入門基礎(2)

目錄 一、引用: 1、定義&#xff1a; 2、特性&#xff1a; 3、引用的使用&#xff1a; 4、const引用&#xff1a;控制權限 const引用定義: const引用可以接收3種對象&#xff1a; 1、正常對象&#xff1a; 2、臨時對象&#xff1a; 3、const對象&#xff1a; 總結&…

C++筆試強訓3

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、選擇題1-5題6-10題 二、編程題題目一題目二 一、選擇題 1-5題 如圖所示&#xff0c;如圖所示p-3指向的元素是6&#xff0c;printf里面的是%s&#xff0c;從6開…

Java爬蟲翻頁

編寫一個Java爬蟲以進行翻頁通常涉及到使用HTTP客戶端&#xff08;如Apache HttpClient或OkHttp&#xff09;來發送請求&#xff0c;解析HTML頁面&#xff08;如使用Jsoup庫&#xff09;&#xff0c;以及處理分頁邏輯&#xff08;如通過URL參數或頁面內的鏈接進行翻頁&#xff…

華為機試HJ108求最小公倍數

華為機試HJ108求最小公倍數 題目&#xff1a; 想法&#xff1a; 要找到輸入的兩個數的最小公倍數&#xff0c;這個最小公倍數要大于等于其中最大的那個數值&#xff0c;遍歷最大的那個數值的倍數&#xff0c;最大的最小公倍數就是輸入的兩個數值的乘積 input_number_list i…

C++休眠的方法

Windows的API函數 Sleep(INFINITE); 休眠時間為永久 Linux的API函數sleep 沒有直接表示無限時間的參數&#xff0c;根據POSIX標準&#xff0c;sleep() 函數的參數應該是 unsigned int 類型&#xff0c;因此最大可以接受的參數值是 UINT_MAX&#xff0c;即 4294967295 秒。sleep…

OpenFWI代碼

重點關注文章第4部分 一、代碼模塊概覽 這一部分了解代碼主要實現的功能有哪些。 二、運行 這一部分關注如何跑通。 三、數據集 12個數據集&#xff08;11個2D1個3D&#xff09; 對計算機而言&#xff0c;上述輸入、輸出維度大小是按次數定義的。 以“Vel&#xff0c;F…

線程池【開發實踐】

文章目錄 一、為什么要用線程池1.1 單線程的問題1.2 手動創建多線程的問題1.3 線程池的作用&#xff08;優點&#xff09;1.4 線程池的使用場景 二、線程池的基礎知識2.1 線程池的核心組件2.2 JUC中的線程池架構2.3 線程池的配置參數2.4 線程池常見的拒絕策略&#xff08;可自定…

appium 實戰問題 播放視頻時無法定位到元素

背景 在做UI自動化時&#xff0c;有播放詳情頁的用例&#xff0c;但是發現視頻在播放的時候無法定位到元素或者很慢&#xff0c;了解到appium在動態的頁面實時獲取布局元素導致定位變慢。所以只能將視頻暫停在操作元素&#xff0c;點擊到暫停按鈕又是個問題&#xff0c;通過ad…

昇思25天學習打卡營第21天|LSTM+CRF序列標注

1. 學習內容復盤 概述 序列標注指給定輸入序列&#xff0c;給序列中每個Token進行標注標簽的過程。序列標注問題通常用于從文本中進行信息抽取&#xff0c;包括分詞(Word Segmentation)、詞性標注(Position Tagging)、命名實體識別(Named Entity Recognition, NER)等。以命名…

Spring Boot項目中JPA操作視圖會改變原表嗎?

一直有一種認識就是:使用JPA對視圖操作,不會影響到原表。 直觀的原因就是視圖是一種數據庫中的虛擬表,它由一個或多個表中的數據通過SQL查詢組成。視圖不包含數據本身,而是保存了一條SQL查詢,這條查詢是用來展示數據的。 但是在實際項目種的一個場景顛覆和糾正了這個認識…

匯川伺服 (4)FFT、機械特性、閉環、慣量、剛性、抑制振動

一、參數解釋 二、FFT 三、機械特性分析 四、多級配方與對象字典 對機組網配方 對象字典 五、InoServoShop 主要是用于調試620P620N將壓縮報解壓后不需要安裝就可以直接使用 六、InoDriveWorkShop 主要是調試660 670 810 520 等系列 慣量識別 Etune Stune 慣量比調試 大慣…

Error:sql: expected 1 arguments, got 2

一 背景 在測試一個API接口時&#xff0c;看到日志里面突然拋出一個錯誤&#xff1a;Error:sql: expected 1 arguments, got 2 看了下&#xff0c;對應的表里面是有相關數據的&#xff0c;sql語句放在mysql里面執行也是沒問題&#xff01;那奇了怪了&#xff0c;為啥會產生這樣…

git只列出本地分支

git只列出本地分支 git branch --list git強制刪除本地分支 git branch -D_error: the branch dlx-test is not fully merged. -CSDN博客文章瀏覽閱讀648次。git branch -d 可以通過: git branch 查看所有本地分支及其名字&#xff0c;然后刪除特定分支。git刪除遠程remote分支…

算法之工程化內容(2)—— Git常用命令

目錄 1. git初始化配置 2. 新建倉庫 3. 工作區——>暫存區——>本地倉庫 4. git reset回退版本 5. 查看差異 git diff 6. 刪除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和刪除 10. 解決合并沖突 11. 回退和rebase 12. 添加遠程倉庫 參考鏈接&#xff…