跳至主要內容

Java并发编程:Future接口

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

Java并发编程:Future接口

Future 是Java并发编程中用于管理异步任务的核心接口,属于java.util.concurrent包。它代表异步计算的结果,提供检查任务状态、等待结果和取消任务等功能。

目录

  1. Future接口概述
  2. 核心方法详解
  3. 与ExecutorService结合使用示例
  4. 取消任务示例
  5. 异常处理
  6. 总结

1. 概述

Future 接口的核心功能:

  • 异步结果管理:通过get()方法获取任务结果
  • 任务状态查询isDone()检查任务是否完成
  • 任务控制cancel()取消任务执行

典型使用场景:

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

2. 核心方法

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

3. 使用示例

import java.util.concurrent.*; class MyCallable implements Callable<Integer> { @Override public Integer call() throws Exception { Thread.sleep(2000); // 模拟耗时操作 return 123; } } public class FutureDemo { 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(3, TimeUnit.SECONDS); // 等待3秒 System.out.println("任务结果:" + result); } catch (TimeoutException e) { future.cancel(true); // 超时后取消任务 System.out.println("任务超时,已取消"); } catch (InterruptedException | ExecutionException e) { System.out.println("任务异常:" + e.getMessage()); } finally { executor.shutdown(); } } } 

输出示例

任务已提交 任务结果:123 

4. 取消任务

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); 

输出示例

任务被中断 

5. 异常处理

Future<String> future = executor.submit(() -> { throw new RuntimeException("模拟业务异常"); }); try { String result = future.get(); } catch (ExecutionException e) { System.out.println("捕获任务异常:" + e.getCause().getMessage()); } 

输出示例

捕获任务异常:模拟业务异常 

6. 总结

  • 适用场景:异步计算、非阻塞IO操作
  • 最佳实践
    1. 始终设置get()方法的超时时间
    2. 对可取消任务调用cancel(true)
    3. 使用isDone()避免不必要的阻塞
    4. 优先使用CompletableFuture替代原始Future

通过合理使用Future接口,可以显著提升Java应用的异步编程能力。

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