Java CompletableFuture:allOf等待所有异步线程任务结束(4)

Java CompletableFuture:allOf等待所有线程任务结束(4)

   private void method() throws ExecutionException, InterruptedException {
        CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return "f1";
        });

        f1.whenCompleteAsync(new BiConsumer<String, Throwable>() {
            @Override
            public void accept(String s, Throwable throwable) {
                System.out.println(System.currentTimeMillis() + ":" + s);
            }
        });

        CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return "f2";
        });

        f2.whenCompleteAsync(new BiConsumer<String, Throwable>() {
            @Override
            public void accept(String s, Throwable throwable) {
                System.out.println(System.currentTimeMillis() + ":" + s);
            }
        });

        CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2);

        //阻塞,直到所有任务结束。
        System.out.println(System.currentTimeMillis() + ":阻塞");
        all.join();
        System.out.println(System.currentTimeMillis() + ":阻塞结束");

        //一个需要耗时2秒,一个需要耗时3秒,只有当最长的耗时3秒的完成后,才会结束。
        System.out.println("任务均已完成。");
    }

输出:

06-12 20:16:37.400 31142-31142/zhangphil.test I/System.out: 1528805797400:阻塞
06-12 20:16:39.406 31142-31171/zhangphil.test I/System.out: 1528805799406:f2
06-12 20:16:40.404 31142-31170/zhangphil.test I/System.out: 1528805800404:f1
06-12 20:16:40.404 31142-31142/zhangphil.test I/System.out: 1528805800404:阻塞结束
    任务均已完成。

可以看到f2很快就返回,是因为f2仅耗时2秒。f1需要耗时3秒,因此在f2结束后一秒,f1也返回。此时才执行join后的代码。

  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
如果你想要等待所有的任务执行完成之后再继续执行下面的代码,可以使用Java 8中的CompletableFuture类来实现。CompletableFuture类是一个可以帮助我们简化异步编程的工具类,它可以将多个异步任务组合成一个新的异步任务。 你可以使用CompletableFuture的静态方法`allOf()`来等待所有的任务执行完成。`allOf()`方法接受一个可变参数,可以将多个CompletableFuture对象传入其中,然后返回一个新的CompletableFuture对象。当所有的CompletableFuture对象都执行完成之后,这个新的CompletableFuture对象就会完成,你可以在这个对象上调用`join()`方法来等待所有的任务执行完成。 下面是一个使用CompletableFuture等待所有任务执行完成的例子: ```java List<CompletableFuture<Void>> futures = new ArrayList<>(); for (int i = 0; i < 10; i++) { CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { // 执行异步任务 }); futures.add(future); } CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])); allFutures.join(); // 所有的异步任务都执行完成之后,继续执行下面的代码 ``` 在这个例子中,我们创建了10个异步任务,并将它们的CompletableFuture对象添加到一个列表中。然后,我们使用`CompletableFuture.allOf()`方法来等待所有的任务执行完成,并调用`join()`方法来阻塞当前线程,直到所有的任务执行完成。最后,在所有的任务执行完成之后,我们可以继续执行下面的代码。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值