Skip to content

CompletableFutureTask

  • CompletableFutureTask和CompletableFuture的区别是:
    • FutureTask:FutureTask 是一种实现了 Runnable 和 Future 接口的任务,它可以包装一个 Callable 或 Runnable 对象,并且可以提交给 ExecutorService 来执行。执行完成后,可以使用 Future 方法来获取执行结果。
    • CompletableFuture:CompletableFuture 是 Java 8 引入的一种更高级的工具,用于处理异步计算。它不仅实现了 Future 接口,还提供了很多方法来进行流式处理、组合多个异步任务和手动完成计算。
  • CompletableFutureTask可以用来包装Runnable对象。
  • CompletableFutureTask可以用来获取异步计算的结果。
  • CompletableFutureTask的使用方法:
    • 创建一个Runnable对象。
    • 创建一个CompletableFutureTask对象,将Runnable对象传递给CompletableFutureTask的构造方法。
    • 创建一个Thread对象,将CompletableFutureTask对象传递给Thread的构造方法。
    • 调用Thread对象的start()方法启动线程。
    • 调用CompletableFutureTask对象的get()方法获取异步计算的结果。
    • 代码示例:
java
package io.alex.concurrent;

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

public class CompletableFutureExample {
    public static void main(String[] args) {
        // 创建一个异步计算任务
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2000); // 模拟耗时操作
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 10;
        });

        future.thenApply(result -> {
            // 对上一步的计算结果进行加倍
            System.out.println("Initial result: " + result);
            return result * 2;
        }).thenAccept(finalResult -> {
            // 输出最终结果
            System.out.println("Final result: " + finalResult);
        }).exceptionally(ex -> {
            // 处理异常
            System.err.println("Exception: " + ex.getMessage());
            return null;
        });

        // 主线程继续执行其他操作
        System.out.println("Main thread is doing something else...");

        // 等待异步计算完成
        try {
            System.out.println("Waiting for the future to complete...");
            Integer i = future.get();// 等待计算完成
            System.out.println("Future is done. result =>"+i);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}