当Future.get(超时)超时时,线程是否继续运行

时间:2010-12-08 10:00:38

标签: java multithreading

如标题所示,如果Future.get(超时)超时,则线程是否继续运行,

ExecutorService executor = Executors.newFixedThreadPool(n);
Callable<Object> task = new Callable<Object>() {
  public Object call() {
       //...
 }
}
Future<Object> future = executor.submit(task);
try {
  Object result = future.get(5, TimeUnit.SECONDS); 
} catch (TimeoutException ex) {
  // handle the timeout
}

如果线程继续运行并因某些IO等而被阻塞,那么当线程池变满时,不能对新任务进行总结,这意味着trheadpool会被卡住,因为池中的所有线程都被阻塞,正确?

2 个答案:

答案 0 :(得分:6)

对future.get(..)的调用将阻止运行它的线程最多5秒。线程池执行的任务不受影响,并将继续运行,直到正常终止/异常/中断。

关于线程池满负荷时提交新任务,在您的情况下,将提交任务(立即释放提交者线程),但是将在线程池队列中等待执行。 API documentation of Executors.newFixedThreadPool(..)清楚地说明了这一点。

答案 1 :(得分:3)

是的,在IO抛出异常或结束之前,底层线程将处于活动状态。