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

4
如果Future.get(timeout)超时,线程会继续运行吗?
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等原因继续运行并被阻塞,那么当线程池满时,就不能提交新任务了,这意味着线程池会被卡住,因为池中所有线程都被阻塞了,对吗?

你尝试添加一些I/O看看会发生什么了吗? - Martijn Verburg
2个回答

6

future.get(..)的调用将会阻塞运行它的线程,最长达5秒。线程池执行的任务不会受到影响,并且会一直运行直到优雅终止/异常/中断。

关于在线程池已满的情况下提交新任务,对于您的情况,任务将被提交(立即释放提交线程),但将在线程池队列中等待执行。 Executors.newFixedThreadPool(..)的API文档清楚地指明了这一点。


3

对的,底层线程会一直保持活动状态,直到IO抛出异常或结束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接