2012-03-05 66 views
0

嘗試從fixedThreadPool調用可調用列表時遇到問題。雖然所有可調用的命令都會執行,但其中一些可能同時被分派到不同的線程,因此它們實際上被稱爲不止一次。請參見下面的代碼:ExecutorService invokeAll()重複被調用的Callable

try { 
    ExecutorService es = Executors.newFixedThreadPool(Environment.nThreads); 
    es.invokeAll(Environment.jobPool); 
    es.shutdown(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+1

您確定您沒有將相同任務添加到您傳遞給ExecutorService的集合多次?你也確定你的任務在運行期間沒有任何異常嗎? – 2012-03-05 12:26:12

+3

很難想象這個問題出在這段代碼中。 「Environment.jobPool」是如何構建的? – 2012-03-05 12:27:42

+0

這是創建jobPool的代碼片段 public static final ArrayList > jobPool = new ArrayList >(); 這是作業被添加到它的位置: Environment.jobPool.add(Executors.callable(new Job(eval,validator))); @Andrei我不明白如何調用一個可調用對象,即使在拋出異常時也會調用兩次。我不認爲他們做了,因爲我傾向於在控制檯中打印所有異常。 – Renaud 2012-03-05 21:09:40

回答

0

你可能有重複你的一些Callable任務列表。嘗試使用java.util.Set正確實施每個Callable實現的equal方法。

0

如果Callable引發未捕獲的異常,則行爲未定義。例如,對於中斷異常來停止ExecutorService。此外,由於incokeAll接受一個集合,打造一個HashSet出你的ArrayList並將它傳遞只是爲了確保你沒有什麼重複

Set<?> set = new HashSet<?>(jobPool); 

我敢肯定的ExecutorService的不只是調用相同的Callable兩次。

相關問題