對於我的Java項目,我想並行執行兩個任務併合並它們的結果。問題是我必須在每次執行時調用多次(可能是1000次或更多)的方法中執行此操作。 我試着用的ExecutorService和線程池,但如果我宣佈的ExecutorService作爲一類領域,開始提交的工作吧,在某個時刻,它拋出一個Java - 重用線程池
java.lang.OutOfMemoryError: unable to create new native thread
所以我決定去與此代碼:
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Integer> taskOne = executor.submit(new Callable<Integer>() {
public Integer call() throws Exception {
//Do work...
return 0;
}
});
Future<Integer> task2 = executor.submit(new Callable<Integer>() {
public Integer call() throws Exception {
//Do work...
return 0;
}
});
task1.get();
task2.get();
executor.shutdown();
while(!executor.isTerminated());
問題是,與單線程解決方案相比,採用這種新方法後,應用程序性能更差。我認爲這是由於在每個方法調用上創建一個新的線程池的開銷。
所以,我的問題是:有沒有辦法做同樣的任務,但不必創建和關閉線程池每個方法的調用?
謝謝。
在每次調用時創建一個線程池沒有意義。你能發佈原始代碼嗎? – shmosel
'task1.get()'是一個阻塞操作,所以你已經有了兩個任務結果。沒有必要關閉執行程序並重新創建它。每次執行應用程序只執行一次。 – Cosu