Rei*_*ica 5 java parallel-processing quicksort executor
我正在实现一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但如果我在调用我的非递归quicksort()方法后立即运行e.shutdown(),它有一堆RejectedExecutionExceptions,所以我认为这不像我想要的那样好.
所以无论如何,我基本上试图获得与leftThread.join()相同的功能但是使用Executor,我的问题是:
这是等待所有线程完成的最好方法吗?
编辑:好的,所以我弄清楚为什么在关闭我的Executor后出现了一堆错误,这是因为我在循环中调用了这个函数(甚至运行时间)并且没有创建新的Executor.
你使用什么类型的执行者?
ThreadPoolExecutor.awaitTermination() 会做你要问的事情(它实际上是一个批量连接操作).
总而言之,ThreadPoolExecutor将允许你设置线程数等的限制......(如果线程数很高,可能比你正在做的递归更好,不确定).
PS - 我怀疑执行程序会使代码运行得更快,但它们可能使代码更易于阅读和维护.使用线程池可以使这种算法更快,Executor使得使用线程池变得更容易.
| 归档时间: |
|
| 查看次数: |
10690 次 |
| 最近记录: |