[英]Wait for all threads in an Executor to finish?
我正在實現一個parellel quicksort作為編程實踐,在我完成后,我閱讀了Executors上的Java教程頁面,聽起來他們可以讓我的代碼更快。 不幸的是,我依靠join()來確保程序不會繼續,直到所有內容都被排序。 現在我正在使用:
public static void quicksort(double[] a, int left, int right) {
if (right <= left) return;
int i = partition(a, left, right);
// threads is an AtomicInteger I'm using to make sure I don't
// spawn a billion threads.
if(threads.get() < 5){
// ThreadSort's run method just calls quicksort()
Future leftThread = e.submit(new ThreadSort(a, left, i-1));
Future rightThread = e.submit(new ThreadSort(a, i+1, right));
threads.getAndAdd(2);
try {
leftThread.get();
rightThread.get();
}
catch (InterruptedException ex) {}
catch (ExecutionException ex) {}
}
else{
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
}
這似乎工作正常,但如果我在調用我的非遞歸quicksort()方法后立即運行e.shutdown(),它有一堆RejectedExecutionExceptions,所以我認為這不像我想要的那樣好。
所以無論如何,我基本上試圖獲得與leftThread.join()相同的功能,但是使用Executor,我的問題是:
這是等待所有線程完成的最佳方式嗎?
編輯:好的,所以我弄清楚為什么在關閉我的Executor后出現了一堆錯誤,這是因為我在循環中調用了這個函數(甚至運行時間)並且沒有創建新的Executor。
你使用什么類型的執行者?
ThreadPoolExecutor
.awaitTermination()
將執行您所要求的(它實際上是批量連接操作)。
總而言之,ThreadPoolExecutor將允許你設置線程數等的限制......(如果線程數很高,可能比你正在做的遞歸更好,不確定)。
PS - 我懷疑執行程序會使代碼運行得更快,但它們可能使代碼更易於閱讀和維護。 使用線程池可以使這種算法更快,Executor使得使用線程池變得更容易。
看一下Executors.newFixedThreadPool
,它允許你創建一個最多n個線程的池(刪除你的“if”)和ExecutorService.shutdown
方法以及ExecutorsService.awaitTermination
方法。
您可以使用CountDownLatch
PS - 我懷疑執行程序會使代碼運行得更快,但它們可能使代碼更易於閱讀和維護。 使用線程池可以使這種算法更快,Executor使得使用線程池變得更容易。
這是不正確的。
執行程序可以由任意數量的不同執行系統“支持”,包括池化線程。
您需要正確調用工廠類。
此外,您還需要確定一個策略來處理將作業提交到隊列的速度快於可以使用的情況,因為由於線程執行的限制,您最初可能不會耗盡內存,但如果排隊數百萬工作,然后他們必須在等待執行時存儲在某個地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.