java實現,等待多個非同步任務完成
阿新 • • 發佈:2021-06-11
今天和各位有緣看客分享兩個東西,CountDownLatch和CompletableFuture。
之前在工作中遇到了一個場景,大意如下:
主執行緒發起幾個非同步任務,然後等待所有非同步任務完成後,才能進行下一步,那一次很栽面,居然沒寫出來,一方面知識匱乏、經驗不足,一方面第一次遇到這種情況,心態有點慌。
最終請教了同組的大佬,大佬驚呼:CompletableFuture你不會嗎?
有遇到類似場景的小夥伴,可以查一下這兩個東西,首推CompletableFuture,這個東西很強大,但是,如果你像我當時一樣,慌得一批,你可以先學一下CountDownLatch,使用簡單,也能達到等待全部非同步任務的效果。
簡單寫了個簡易的小東西,初學的小夥伴可以參考下:
public class ParallelHandler<T> { private List<CompletableFuture<T>> futures; ParallelHandler () { this(10); } ParallelHandler (int size) { futures = new ArrayList<>(size); } public ParallelHandler addResTask (Supplier<T> supplier) { futures.add(CompletableFuture.supplyAsync(supplier));return this; } public List<CompletableFuture<T>> OK () { waits(); return futures; } public void waits () { CompletableFuture.allOf(futures.toArray(new CompletableFuture[]{})).join(); } public void clear () { futures.clear(); } }
用法如下:
public static void main(String[] args) throws InterruptedException { ParallelHandler handler = new ParallelHandler(); handler.addResTask(()->"done") .addResTask(()->{ try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } return "finally"; }); List<CompletableFuture<String>> futures = handler.OK(); futures.stream().forEach(item -> { System.out.println(item.getNow("no result")); }); }
就這麼個意思吧,可以選擇要返回值,也可以不要返回值,也可以clear然後複用。
根據實際情況,建議在使用中主動給CompletableFuture一個執行緒池。