我正在实施并行快速排序作为编程实践,完成后,我阅读了 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,我的问题是:
这是等待所有线程完成的最佳方法吗?
编辑:好的,所以我弄清楚了为什么我在关闭我的执行程序后出现了一堆错误,这是因为我在循环中调用这个函数(以平衡运行时间)而不是创建一个新的执行程序。