兔森破933 2023-08-29 17:17 采纳率: 71.4%
浏览 4
已结题

异步编排如何准确的在异步线程全部结束后继续进行非异步的代码?

异步编排如何准确的在异步线程全部结束后继续进行非异步的代码?

img


如上代码我在allof获取结果之后(虽然这块代码没结果,但是有有结果的地方)还想继续根据结果不再用异步编排处理而是用普通的线程逻辑进行处理该怎么做?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-08-29 17:53
    关注

    引用 皆我百晓生 小程序回复内容作答:
    在异步编排中,可以使用CompletableFuture的join()方法来等待异步线程全部结束,然后继续执行非异步的代码。join()方法会阻塞当前线程,直到所有的异步线程都执行完毕。

    在上述代码中,可以在CompletableFuture.allOf()之后使用join()方法阻塞当前线程,等待所有的异步任务执行完毕。然后根据需要处理结果,可以通过isCancelled()、isCompletedExceptionally()、isCompletedNormally()等方法来判断异步任务的执行状态。

    下面是修改后的代码示例:

    public class AsyncExample {
    
        public static void main(String[] args) {
            CompletableFuture<Void> future1 = asyncMethod1();
            CompletableFuture<Void> future2 = asyncMethod2();
            CompletableFuture<Void> future3 = asyncMethod3();
    
            CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
    
            allFutures.join(); // 等待所有的异步任务执行完毕
            
            // 异步任务执行完毕后,继续执行非异步的代码逻辑
            if (!future1.isCompletedExceptionally() && !future2.isCompletedExceptionally() && !future3.isCompletedExceptionally()) {
                // 执行非异步的代码逻辑
                System.out.println("All async tasks completed successfully!");
            } else {
                System.out.println("Some async tasks failed!");
                // 处理异步任务失败的情况
            }
        }
    
        public static CompletableFuture<Void> asyncMethod1() {
            return CompletableFuture.runAsync(() -> {
                // 异步任务1的逻辑
            });
        }
    
        public static CompletableFuture<Void> asyncMethod2() {
            return CompletableFuture.runAsync(() -> {
                // 异步任务2的逻辑
            });
        }
    
        public static CompletableFuture<Void> asyncMethod3() {
            return CompletableFuture.runAsync(() -> {
                // 异步任务3的逻辑
            });
        }
    }
    

    在上述代码中,使用CompletableFuture.allOf()方法将所有的异步任务组合成一个CompletableFuture,然后使用join()方法等待所有的异步任务执行完毕。根据异步任务的执行状态,可以继续执行相应的处理逻辑。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月7日
  • 已采纳回答 8月30日
  • 创建了问题 8月29日