我正在实现并行快速排序作为编程实践,完成后,我阅读了 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() 相同的功能,但使用执行器,我的问题是:
这是等待所有线程完成的最佳方法吗?
编辑:好的,所以我弄清楚为什么在关闭执行器后出现一堆错误,这是因为我在循环中调用这个函数(以平衡运行时间)而不是创建一个新的执行器。
您使用什么类型的执行器?
ThreadPoolExecutor http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html.awaitTermination()
将执行您所询问的操作(这实际上是批量连接操作)。
总而言之,ThreadPoolExecutor 将允许您设置线程数量的限制等...(如果线程计数变高,可能比像您所做的那样递归更好,不确定)。
PS - 我怀疑执行器会让你的代码运行得更快,但它们可能会让你的代码更容易阅读和维护。使用线程池将使此类算法的速度更快,并且执行器可以轻松使用线程池。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)