在Java中,异步编程是一种常用的技术,它允许应用程序在不阻塞主线程的情况下执行长时间运行的任务。CallableFuture是Java并发包中的一个重要组件,它提供了对异步计算结果的访问。本文将深入探讨CallableFuture的结束回调,并介绍如何在Java中有效地使用它。

CallableFuture简介

CallableFuture是一个接口,它扩展了Future接口,并允许返回计算的结果。与Future相比,Callable可以抛出异常,这使得错误处理更加灵活。

Callable接口

Callable接口定义了一个无参的call()方法,该方法返回一个结果或抛出一个异常。与Runnable相比,Callable可以处理复杂的结果类型,并且可以抛出异常。

@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}

Future接口

Future接口提供了对异步计算结果的访问。它定义了以下方法:

  • V get():返回Callable任务的结果。如果任务尚未完成,则该方法将阻塞,直到任务完成。
  • boolean isDone():如果任务已完成,则返回true
  • boolean cancel(boolean mayInterruptIfRunning):尝试取消正在执行的任务。

CallableFuture

CallableFuture结合了CallableFuture的特性,它提供了以下方法:

  • V get():与Future接口中的get()方法相同。
  • boolean isDone():与Future接口中的isDone()方法相同。
  • boolean cancel(boolean mayInterruptIfRunning):与Future接口中的cancel()方法相同。

CallableFuture结束回调

CallableFuture任务完成时,我们可以通过回调函数来处理结果或异常。以下是几种常用的回调方法:

1. 使用FutureTask

FutureTaskCallableFuture的一个实现,它提供了以下方法来处理回调:

  • V get():返回Callable任务的结果。
  • boolean isDone():如果任务已完成,则返回true
  • boolean cancel(boolean mayInterruptIfRunning):尝试取消正在执行的任务。
Callable<String> task = () -> {
    // 执行长时间运行的任务
    return "结果";
};

FutureTask<String> futureTask = new FutureTask<>(task);
new Thread(futureTask).start();

try {
    String result = futureTask.get();
    System.out.println("任务完成,结果为:" + result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

2. 使用CompletionService

CompletionService是一个接口,它允许你提交多个异步任务,并按完成顺序获取结果。以下是一个使用CompletionService的示例:

ExecutorService executor = Executors.newFixedThreadPool(2);
CompletionService<String> completionService = new ExecutorCompletionService<>(executor);

Callable<String> task1 = () -> "结果1";
Callable<String> task2 = () -> "结果2";

completionService.submit(task1);
completionService.submit(task2);

for (int i = 0; i < 2; i++) {
    Future<String> future = completionService.take();
    try {
        String result = future.get();
        System.out.println("任务完成,结果为:" + result);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}

3. 使用CompletableFuture

CompletableFuture是Java 8引入的一个新特性,它提供了更加丰富的异步编程功能。以下是一个使用CompletableFuture的示例:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 执行长时间运行的任务
    return "结果";
});

future.thenApply(result -> "处理后的结果:" + result)
     .thenAccept(System.out::println)
     .exceptionally(ex -> "异常:" + ex.getMessage())
     .join();

总结

在Java中,CallableFuture是异步编程的一个重要组件。通过使用结束回调,我们可以有效地处理异步任务的结果或异常。本文介绍了三种常用的回调方法,包括使用FutureTaskCompletionServiceCompletableFuture。希望这些信息能帮助你更好地理解和应用Java异步编程。