是否线程继续运行时的Future.get(超时)超时
问题描述:
正如标题所显示,如果的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会被卡住,因为池中的所有线程都被阻塞了,对吗?
答
对future.get(..)的调用将阻止运行它的线程长达5秒钟。线程池执行的任务将不受影响,并将继续运行,直到正常终止/异常/中断。
关于在线程池满负荷时提交新任务,在您的情况下,任务将被提交(立即释放提交者线程),但会在线程池队列中等待执行。 API documentation of Executors.newFixedThreadPool(..)明确指出了这一点。
答
正确的,下层线程将直播,直到IO抛出异常或结束。
你试过添加一些I/O来看看会发生什么吗? – 2010-12-08 10:07:49