跳至主要內容

Java并发编程:Callable与Future

程序猿DD原创JavaJava大约 2 分钟

Java并发编程:Callable与Future

CallableFuture 是Java并发编程中处理异步任务的核心接口,属于java.util.concurrent包。Callable类似于Runnable,但支持返回结果和抛出受检异常;Future则代表异步计算的结果,提供任务状态管理和结果获取功能。

目录

  1. Callable接口详解
  2. Future接口详解
  3. 与ExecutorService协同使用
  4. 基础使用示例
  5. 异常处理示例
  6. 任务取消示例
  7. 总结

1. Callable接口

Callable是一个函数式接口,定义如下:

@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}
  • 特性
    • 支持返回泛型结果V
    • 允许抛出受检异常
    • 替代无返回值的Runnable

2. Future接口

Future代表异步任务的结果,核心方法:

方法名描述
V get()阻塞直到任务完成,返回结果或抛出异常
boolean cancel(boolean mayInterrupt)尝试取消任务(mayInterrupt为true时中断执行线程)
boolean isDone()检查任务是否完成(正常结束、异常或取消)
boolean isCancelled()检查任务是否在完成前被取消

3. 与ExecutorService协同使用

通过ExecutorService提交Callable任务:

ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Integer> future = executor.submit(() -> {
    Thread.sleep(2000);
    return 123;
});

4. 基础使用示例

import java.util.concurrent.*;

class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        Thread.sleep(2000); // 模拟耗时操作
        return 123;
    }
}

public class CallableFutureDemo {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Integer> future = executor.submit(new MyCallable());

        System.out.println("任务已提交");
        try {
            int result = future.get(); // 阻塞直到结果返回
            System.out.println("任务结果:" + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } finally {
            executor.shutdown();
        }
    }
}

输出

任务已提交
任务结果:123

5. 异常处理示例

Future<String> future = executor.submit(() -> {
    throw new RuntimeException("业务逻辑异常");
});

try {
    String result = future.get();
} catch (ExecutionException e) {
    System.out.println("捕获任务异常:" + e.getCause().getMessage());
}

输出

捕获任务异常:业务逻辑异常

6. 任务取消示例

Future<?> future = executor.submit(() -> {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        System.out.println("任务被中断");
    }
});

// 延迟2秒后取消任务
executor.schedule(() -> {
    if (!future.isDone()) {
        future.cancel(true); // 中断执行中的线程
    }
}, 2, TimeUnit.SECONDS);

输出

任务被中断

7. 总结

  • Callable优势:支持返回值和异常处理
  • Future功能
    • 异步结果获取
    • 任务状态监控
    • 超时控制与取消
  • 最佳实践
    1. 始终设置get()方法的超时时间
    2. 使用CompletableFuture实现更复杂的异步编排
    3. 对可取消任务调用cancel(true)

通过CallableFuture的组合,开发者可以高效地管理异步任务,提升Java应用的并发性能。

上次编辑于:
贡献者: 程序猿DD