2010-12-08 129 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拋出異常或結束。