首页 文章

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

提问于
浏览
4

正如 Headers 所示,如果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 回答

  • 6

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

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

  • 3

    是的,在IO抛出异常或结束之前,底层线程将一直存在 .

相关问题