Java中通过FutureTask的get()方法阻塞获取线程返回值,需先用Callable构造FutureTask并显式启动任务,再调用带超时的get()并捕获TimeoutException、InterruptedException和ExecutionException。

Java 中通过 FutureTask 阻塞获取线程执行返回值,核心是利用其 get() 方法的阻塞特性——调用线程会一直等待,直到任务完成并返回结果。
创建 FutureTask 并关联 Callable 任务
FutureTask 是 Runnable 和 Future 的实现类,必须包装一个 Callable(支持返回值和异常)或 Runnable(无返回值)。要获取返回值,优先使用 Callable:
- 定义一个实现
Callable<String>的任务,比如耗时计算或远程调用 - 用该
Callable构造FutureTask实例 - 将
FutureTask提交到线程(如Thread或线程池)执行
启动任务后调用 get() 主动阻塞等待
调用 futureTask.get() 会阻塞当前线程,直到任务执行完毕。它有两类常用重载:
-
get():无限期等待,直到结果可用(可能永久阻塞,慎用) -
get(long timeout, TimeUnit unit):带超时机制,避免线程长期挂起;超时抛出TimeoutException
注意:若任务执行中抛出异常,get() 会将原始异常包装为 ExecutionException 抛出,需捕获处理。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
确保任务已启动再调用 get()
FutureTask 不会自动执行,必须显式启动:
- 传给
new Thread(futureTask).start()启动 - 或提交到
ExecutorService:executor.submit(futureTask)(注意submit(Callable)内部已封装为FutureTask,通常无需手动创建)
如果未启动就调用 get(),线程会一直阻塞——因为任务根本没运行,永远不会完成。
结合 try-catch 正确处理异常与中断
阻塞操作可能被中断,也可能任务失败,推荐标准写法:
try {
String result = futureTask.get(5, TimeUnit.SECONDS);
System.out.println("结果:" + result);
} catch (TimeoutException e) {
System.err.println("任务超时");
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
System.err.println("等待被中断");
} catch (ExecutionException e) {
Throwable cause = e.getCause();
System.err.println("任务执行异常:" + cause);
}

















