等待所有的线在一个遗嘱执行人完成?
-
21-09-2019 - |
题
我执行一个平行的快速排序,作为编程的做法,并在我完成之后,我读Java教程页面上的执行人,这声音就像他们可以使我的代码甚至更快。不幸的是,我依赖join()'s到确保程序不会继续,直到一切都是排序。现在我是使用:
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);
}
}
这似乎是工作确定,但如果我跑e。关闭()右后,我请我的非递归的快速排序()方法,它有一堆RejectedExecutionExceptions,所以我认为这不是工作以及为我想要的。
所以无论如何,我基本上是试图获得相同的功能leftThread.join()但与一个遗嘱执行人,和我的问题是:
这是最好的方法等待,直到所有的线是做什么?
编辑:好了,我知道为什么我有一大堆的错误之后关闭我的遗嘱执行人,这是因为我是这个叫功能在一个循环(甚至出运行的时间),而不是创造一个新的执行者。
解决方案
什么类型的执行您使用的是?
ThreadPoolExecutor
.awaitTermination()
将你所问的有关(这是有效的批量连接操作)。
作为整体一边,ThreadPoolExecutor的将允许你在线程等的#设限...(可能是更好的比去递归喜欢自己正在做什么,如果线程数变高,不知道)。
PS - 我怀疑遗嘱执行人将会使你的代码跑得更快,但它们可能使你的代码更容易阅读和维护。使用线程池会使事情这个排序算法的速度更快,执行人可以很容易地工作,线程池。
其他提示
看看 Executors.newFixedThreadPool
其中,您可以创建一个水池在最n线(摆脱了你的"如果")和 ExecutorService.shutdown
方法和 ExecutorsService.awaitTermination
法。
您可以使用 CountDownLatch
PS - 我怀疑遗嘱执行人将会使你的代码运行得更快,但 他们可以使你的代码更容易阅读和维护。使用线程 池将会使事情更快这种算法,以及 执行程序可以很容易地与工作线程池。
这是不正确的。
在执行程序可以是“备份”由任意数量的不同的执行系统,包括池线程。
您需要正确地调用工厂类。
此外,你还需要一个政策决定,涉及以作业提交到队列的速度比他们可以食用的情况下,因为你可能的不的最初的记忆由于对限用完线程执行,但如果你排队数百万就业机会,那么他们必须同时他们等待执行存储一些地方。