2010-12-08 83 views
2

正如标题所显示,如果的Future.get(超时)超时,并线程继续运行,是否线程继续运行时的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会被卡住,因为池中的所有线程都被阻塞了,对吗?

+0

你试过添加一些I/O来看看会发生什么吗? – 2010-12-08 10:07:49

回答

5

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

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

3

正确的,下层线程将直播,直到IO抛出异常或结束。