Java中用线程池配合Future获取异步结果,需提交Callable任务获得Future对象,调用get()(推荐带超时)阻塞获取结果,isDone()/isCancelled()检查状态,cancel(true)尝试取消任务。

Java 中使用线程池配合 Future 获取异步执行结果,核心是调用 ExecutorService.submit() 提交任务,它会返回一个 Future 对象,再通过其 get() 方法获取结果。
提交 Callable 任务并获取 Future
Future 主要用于封装有返回值的异步任务,因此需使用 Callable(而非 Runnable)来定义任务逻辑。线程池执行后立即返回 Future,不阻塞当前线程。
-
Callable<String>表示任务执行后返回String类型结果 -
submit()返回Future<String>,代表尚未完成的计算结果 - 此时可继续执行其他逻辑,无需等待任务结束
调用 get() 获取结果(注意阻塞与超时)
Future.get() 是获取结果的关键方法,但它会阻塞当前线程,直到任务完成。为避免无限等待,推荐使用带超时的重载方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
future.get():无限期等待,任务异常或中断时抛出对应异常 -
future.get(3, TimeUnit.SECONDS):最多等 3 秒,超时抛出TimeoutException - 任务执行中抛出异常,
get()会包装为ExecutionException抛出
检查任务状态与取消执行
Future 提供了对任务生命周期的控制能力,便于在必要时干预。
立即学习“Java免费学习笔记(深入)”;
-
isDone():返回true表示任务已结束(含正常完成、异常或被取消) -
isCancelled():仅当任务被显式取消且尚未开始执行时返回true -
cancel(true):尝试取消任务;参数true表示中断正在运行的线程 - 已开始执行的任务是否真正停止,取决于任务内部是否响应中断(如检查
Thread.interrupted())
完整示例代码
以下是一个典型用法片段:
ExecutorService pool = Executors.newFixedThreadPool(2);
Future<Integer> future = pool.submit(() -> {
Thread.sleep(1000);
return 42;
});
// 做其他事情...
System.out.println("Doing something else...");
try {
Integer result = future.get(2, TimeUnit.SECONDS); // 等待最多 2 秒
System.out.println("Result: " + result);
} catch (TimeoutException e) {
System.err.println("Task timed out");
} catch (ExecutionException e) {
System.err.println("Task failed: " + e.getCause());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("Waiting interrupted");
} finally {
pool.shutdown(); // 记得关闭线程池
}

















