gpt4 book ai didi

java - 等待 Executor 中的所有线程完成?

转载 作者:搜寻专家 更新时间:2023-10-31 08:14:26 25 4
gpt4 key购买 nike

我正在实现并行快速排序作为编程练习,完成后,我阅读了有关执行程序的 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 .awaitTermination() 将执行您要求的操作(实际上是批量连接操作)。

总而言之,ThreadPoolExecutor 将允许您对线程数等设置限制...(如果线程数变高,可能比像您正在做的那样递归更好,不确定)。

PS - 我怀疑执行器会让您的代码运行得更快,但它们可能会使您的代码更易于阅读和维护。使用线程池将使这种算法的速度更快,并且执行器使使用线程池变得容易。

关于java - 等待 Executor 中的所有线程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1787602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com