了解CompletableFuture
了解CompletableFuture
為什么要引入CompletableFuture
為了獲得最佳性能表現(xiàn),可能就需要仔細(xì)規(guī)劃業(yè)務(wù)流程中的各個(gè)步驟的編排。而Java8就提供了這樣一個(gè)即用容器來(lái)連接一系列任務(wù)。
CompletableFuture 如何來(lái)構(gòu)建一個(gè)任務(wù)鏈呢?這里就不先介紹API了,之前看應(yīng)用場(chǎng)景。
目前有一個(gè)需求:
? 我們需要從 數(shù)據(jù)中臺(tái)中獲取 安徽、江蘇、浙江三省內(nèi)所有企業(yè)信息 及其 子公司 的信息,并按 **子公司數(shù)量 **進(jìn)行排序。
我從觀察到的代碼(finchinaApp)中來(lái)看,如果遇到這種類(lèi)似的需求,基本會(huì)采用多線程池 并發(fā)的查詢(xún)安徽、江蘇、浙江三省的公司,然后線程池內(nèi)線程都結(jié)束執(zhí)行,再對(duì)所有的結(jié)果進(jìn)行排序。
當(dāng)然在這種場(chǎng)景下,使用FutureTask 或者 線程池 +
CountDownLatch countDownLatch = new CountDownLatch(3); new Thread(() - >{//查詢(xún)安徽countDownLatch.countDown(); }).start(); new Thread(() - >{//查詢(xún)江蘇countDownLatch.countDown(); }).start(); new Thread(() - >{//查詢(xún)浙江countDownLatch.countDown(); }).start(); try {countDownLatch.await(); } catch (InterruptedException e) {//日志記錄 } MultiTaskScheduler multiTaskScheduler = new MultiTaskScheduler(); multiTaskScheduler.add(()->{//查詢(xún)安徽 }) multiTaskScheduler.add(()->{//查詢(xún)江蘇 }) multiTaskScheduler.add(()->{//查詢(xún)浙江 }) try {multiTaskScheduler.start(true, 10000); } catch (InterruptedException e) {// + 日志Thread.currentThread().interrupt(); } finally {multiTaskScheduler.shutdown(); }可以觀察到,該使用場(chǎng)景下,不需要引入CompletableFuture。如果是以下場(chǎng)景呢?
簡(jiǎn)單說(shuō)明:
1. 如果業(yè)務(wù)中每個(gè)線程需要線程結(jié)束后立即進(jìn)行處理,而非等待其他線程都結(jié)束再進(jìn)行操作,則需要使用CompletableFuture。 2. 如果 業(yè)務(wù)1 和 業(yè)務(wù)2 并行執(zhí)行,任意一個(gè)任務(wù)失敗/成功,則標(biāo)志整個(gè)業(yè)務(wù)失敗/成功,則需要使用CompletableFuture 3. 如果 每個(gè)線程中有較為復(fù)雜的異步任務(wù)編排(組合多個(gè)Future并行執(zhí)行結(jié)果),則建議使用CompletableFuture,因?yàn)榭梢院?jiǎn)化代碼,同時(shí)極其優(yōu)雅。CompletableFuture的優(yōu)點(diǎn)就在于 :
? ①有回調(diào)函數(shù),可以在執(zhí)行完成后自動(dòng)調(diào)用回調(diào)處理邏輯;
? ②其提供的四十多個(gè)API可以?xún)?yōu)雅的編排任務(wù)鏈(提供異步任務(wù)完成后的鏈?zhǔn)秸{(diào)用);
? ③具備異常處理機(jī)制
CompletableFuture的使用
使用誤區(qū)1:CompletableFuture所有的方法都有額外以Async結(jié)尾的方法。此類(lèi)方法的作用在于不是說(shuō) 后續(xù)任務(wù)可以在前序任務(wù)還沒(méi)執(zhí)行完就可以運(yùn)行。舉例:
總結(jié)
以上是生活随笔為你收集整理的了解CompletableFuture的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 免费在excel密码破解--超好用
- 下一篇: 会考计算机基本知识点总结,高中计算机会考