completionService.submit和CompletableFuture.runAsync方法讲解

当我们使用CompletionService时,通常会结合CompletableFuture和ExecutorService一起使用。下面是一个示例代码,带有注释,以解释completionService.submit(() CompletableFuture.runAsync(())的作用和各自方法的来源:

import java.util.concurrent.*;

public class CompletionServiceExample {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建一个ExecutorService线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);
        
        // 创建一个CompletionService,用于提交任务和获取已完成的结果
        CompletionService<Integer> completionService = new ExecutorCompletionService<>(executor);
        
        // 提交任务,这里使用CompletableFuture.runAsync()创建一个异步任务
        completionService.submit(CompletableFuture.runAsync(() -> {
            // 在这里编写你的具体任务逻辑
            System.out.println("Task 1 is running");
            // 模拟耗时操作
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task 1 is completed");
        }), 1); // 1 是任务的优先级,你可以根据需要设置不同的优先级
        
        // 提交第二个任务
        completionService.submit(CompletableFuture.runAsync(() -> {
            System.out.println("Task 2 is running");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task 2 is completed");
        }), 2);
        
        // 等待获取已完成的任务结果
        for (int i = 0; i < 2; i++) {
            Future<Integer> future = completionService.take(); // 获取已完成的任务
            int priority = future.get(); // 获取任务的优先级
            System.out.println("Task with priority " + priority + " is completed");
        }
        
        // 关闭线程池
        executor.shutdown();
    }
}

在这个示例代码中,我们使用了CompletionService来提交和获取已完成的任务。通过ExecutorCompletionService的构造函数,我们将一个已有的ExecutorService传入CompletionService中。
completionService.submit(CompletableFuture.runAsync(() -> { … }), 1);
这行代码中,我们使用CompletableFuture.runAsync()创建了一个异步任务,并将其提交给CompletionService进行执行。runAsync方法中的Lambda表达式包含了具体的任务逻辑。这里你可以根据需要编写你自己的任务逻辑。我们还传入了优先级参数1,用于标识任务的优先级。
通过循环调用completionService.take(),我们可以从CompletionService中获取已完成的任务。take()方法会阻塞,直到有任务完成。然后,我们可以通过调用future.get()获取任务的结果,这里的结果是我们之前传入的优先级值。
至于这些方法的来源,CompletionService接口和ExecutorCompletionService类都是Java标准库中提供的。而CompletableFuture类是在Java
8中引入的,用于简化异步编程。它提供了一些强大的方法,例如runAsync(),用于创建异步任务。通过结合CompletableFuture和CompletionService,我们能够更方便地提交和获取异步任务的结果。

你可能感兴趣的:(java)