java實現,等待多個異步任務完成


今天和各位有緣看客分享兩個東西,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一個線程池。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM