基于CompletableFuture 异步编排,任务一返回一个字符串,任务2 任务三 依赖任务一返回一个字符串,任务4 任务5 不依赖,请进行异步编排 ,请提供示例代码

使用 CompletableFuture 可以方便地进行异步编排。下面是一个简单的示例代码,演示了如何使用 CompletableFuture 异步编排任务:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {

    public static void main(String[] args) {
        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
            // 任务1返回一个字符串
            System.out.println("Task 1 is running...");
            return "Result from Task 1";
        });

        CompletableFuture<String> task2 = task1.thenApplyAsync(resultFromTask1 -> {
            // 任务2依赖任务1的结果
            System.out.println("Task 2 is running with result: " + resultFromTask1);
            return "Result from Task 2";
        });

        CompletableFuture<String> task3 = task1.thenApplyAsync(resultFromTask1 -> {
            // 任务3也依赖任务1的结果
            System.out.println("Task 3 is running with result: " + resultFromTask1);
            return "Result from Task 3";
        });

        CompletableFuture<Void> combinedTasks = CompletableFuture.allOf(task2, task3);

        CompletableFuture<String> task4 = CompletableFuture.supplyAsync(() -> {
            // 任务4不依赖其他任务
            System.out.println("Task 4 is running...");
            return "Result from Task 4";
        });

        CompletableFuture<String> task5 = CompletableFuture.supplyAsync(() -> {
            // 任务5不依赖其他任务
            System.out.println("Task 5 is running...");
            return "Result from Task 5";
        });

        try {
            // 等待所有任务完成
            combinedTasks.get();
            
            // 获取任务1、任务2、任务3的结果
            String resultFromTask1 = task1.get();
            String resultFromTask2 = task2.get();
            String resultFromTask3 = task3.get();

            // 获取任务4、任务5的结果
            String resultFromTask4 = task4.get();
            String resultFromTask5 = task5.get();

            // 打印结果
            System.out.println(resultFromTask1);
            System.out.println(resultFromTask2);
            System.out.println(resultFromTask3);
            System.out.println(resultFromTask4);
            System.out.println(resultFromTask5);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,任务2和任务3依赖任务1的结果,并且通过 thenApplyAsync 方法来实现这种依赖关系。任务4和任务5没有依赖关系,它们可以并行执行。

请注意,thenApplyAsync 方法用于将一个任务的结果应用到另一个任务上,而 CompletableFuture.allOf(task2, task3) 用于等待任务2和任务3都完成。在实际应用中,您可能需要根据实际需求进行更复杂的异步编排。


如果您需要确保所有任务一起完成,而不是等待每个任务单独完成,您可以使用 CompletableFuture.join 方法,该方法会等待所有 CompletableFuture 完成。

下面是相应的修改:

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {

    public static void main(String[] args) {
        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("Task 1 is running...");
            return "Result from Task 1";
        });

        CompletableFuture<String> task2 = task1.thenApplyAsync(resultFromTask1 -> {
            System.out.println("Task 2 is running with result: " + resultFromTask1);
            return "Result from Task 2";
        });

        CompletableFuture<String> task3 = task1.thenApplyAsync(resultFromTask1 -> {
            System.out.println("Task 3 is running with result: " + resultFromTask1);
            return "Result from Task 3";
        });

        CompletableFuture<String> combinedTasks = CompletableFuture.allOf(task2, task3)
                .thenApplyAsync(ignored -> "Combined result from Task 2 and Task 3");

        CompletableFuture<String> task4 = CompletableFuture.supplyAsync(() -> {
            System.out.println("Task 4 is running...");
            return "Result from Task 4";
        });

        CompletableFuture<String> task5 = CompletableFuture.supplyAsync(() -> {
            System.out.println("Task 5 is running...");
            return "Result from Task 5";
        });

        CompletableFuture<Void> allTasks = CompletableFuture.allOf(combinedTasks, task4, task5);

        try {
            allTasks.join(); // 等待所有任务一起完成

            String resultFromCombinedTasks = combinedTasks.get();
            String resultFromTask4 = task4.get();
            String resultFromTask5 = task5.get();

            // 打印结果
            System.out.println(resultFromCombinedTasks);
            System.out.println(resultFromTask4);
            System.out.println(resultFromTask5);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,CompletableFuture.allOf(task2, task3) 用于等待任务2和任务3完成,然后 thenApplyAsync 方法将这两个任务的结果合并为一个字符串。接着,CompletableFuture.allOf(combinedTasks, task4, task5) 用于等待这三个任务一起完成。最后,使用 allTasks.join() 等待所有任务一起完成。

请注意,join 方法抛出的是非受检异常,您可能需要适当地处理它。此外,具体实现可以根据您的实际需求进行调整。

你可能感兴趣的:(java,前端,算法)