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

Alf*_*red 4 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
}
Run Code Online (Sandbox Code Playgroud)

如果线程继续运行,并得到阻止由于一些IO,等等,那么当线程池得到充分,没有新的任务可sumitted,这意味着trheadpool卡住,因为在池中的所有线程被阻塞,对不对?

Eya*_*der 6

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

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