FutureTask 的 get() 方法可通过重载版本 get(long timeout, TimeUnit unit) 设置超时,超时抛出 TimeoutException;需捕获 InterruptedException、ExecutionException 和 TimeoutException;超时不会自动取消任务,需显式调用 cancel(true)。

Java 中 FutureTask 的 get() 方法本身不直接提供超时参数,但你可以通过其父接口 Future 提供的重载方法 get(long timeout, TimeUnit unit) 来设置超时时间。
使用带超时的 get 方法
FutureTask 实现了 Future 接口,因此可以直接调用带超时参数的 get 方法。该方法在指定时间内等待任务完成,超时后抛出 TimeoutException。
- 语法:
futureTask.get(5, TimeUnit.SECONDS); - 如果任务在 5 秒内完成,返回结果;否则抛出
TimeoutException - 需注意捕获
InterruptedException、ExecutionException和TimeoutException
正确处理异常
超时调用必须妥善处理三种可能异常:
-
InterruptedException:当前线程被中断(如调用interrupt()) -
ExecutionException:任务执行过程中抛出异常(包装在该异常中) -
TimeoutException:等待超时,任务仍未完成
建议按顺序捕获,优先处理 TimeoutException,再处理其他异常。
立即学习“Java免费学习笔记(深入)”;
超时后任务仍在运行?
调用 get(timeout, unit) 超时并不会自动取消任务。任务仍可能在后台继续执行。
- 如需中断未完成的任务,应显式调用
futureTask.cancel(true) -
cancel(true)会尝试中断正在执行的任务线程(前提是任务响应中断) - 若任务已结束或已取消,
cancel返回false
实际使用示例
以下是一个简明示例:
FutureTask<String> task = new FutureTask<>(() -> {
Thread.sleep(10000); // 模拟耗时操作
return "done";
});
new Thread(task).start();
try {
String result = task.get(3, TimeUnit.SECONDS); // 等待最多 3 秒
System.out.println(result);
} catch (TimeoutException e) {
System.err.println("任务超时,准备取消...");
task.cancel(true);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}


















