我有一個需要在for循環中處理的40000條記錄的列表。由於我有一個雙處理器系統。我創建了一個fixedThreadPool這樣的:ExecuterService停止處理兩個線程中的一個線程
int threads = Runtime.getRuntime().availableProcessors(); ExecutorService service = Executors.newFixedThreadPool(threads);
,分我
ArrayList
成兩個子列表。對於這些子列表中的每一個,我創建了一個執行相同功能的Callable
(包括迭代子列表並執行一些處理),並返回一個Future
對象。我提出這兩個
Callable
使用executorServiceObject.submit(callable)
並添加返回Future
對象到我Future
對象
下面的列表是我的問題:
我已經寫了System.Out.printLn("Processed Item" +item.id) // consider item as the name of reference variable for current iteration
一切一段時間沒事了,我可以看到兩條線程同時工作。但過了一段時間,其中一個線程已停止處理。只有一個線程正在運行。 (我知道這一點,因爲我可以在控制檯上看到ID給線程2的內容不再被打印)。
有誰知道這是怎麼發生的?我的意思是爲什麼ExecutorService停止運行第二個線程。
感謝您的幫助提前。
添加示例代碼我以前做過:
public List<Output> processInputs(List<Input> inputs)
throws InterruptedException, ExecutionException {
int threads = Runtime.getRuntime().availableProcessors();
ExecutorService service = Executors.newFixedThreadPool(threads);
List<Future<Output>> futures = new ArrayList<Future<Output>>();
for (final Input input : inputs) {
Callable<Output> callable = new Callable<Output>() {
public Output call() throws Exception {
Output output = new Output();
// process your input here and compute the output
return output;
}
};
futures.add(service.submit(callable));
}
service.shutdown();
List<Output> outputs = new ArrayList<Output>();
for (Future<Output> future : futures) {
outputs.add(future.get());
}
return outputs;
請編輯您的問題以包含您程序中的相關代碼。理想情況下,你應該包含一個能夠重現問題的[mcve]。 – Kenster
這可能不會實際停止。它可能處於等待狀態。檢查非工作線程的運行方法並查看最後執行哪一行。 – pikrut
@pikrut我已經使用'Callable',所以沒有run()方法。其次Callable是在for循環中創建的(1個子列表可調用)。這意味着這兩個子列表的調用方法實現是相同的。 – Aman