当5组线程中的任何一个停止时,如何启动下一个线程



我正在创建一个程序,以便在线程的帮助下并行运行逻辑。逻辑必须在列表的循环中完成,该列表可能包含1000行要处理,所以我在循环中启动每个线程,一旦线程大小达到5,我将为所有5个启动的线程调用thread.join。所以我认为只有在第一组5个线程完成后,这才会开始第二组5个螺纹?我的理解正确吗?我对线程有点陌生。

因此,我需要在前一组5个线程中的任何一个完成后启动第6个线程。或者在前一组线程中的任意2个线程完成时从第6个和第7个开始。

我的代码

public static void executeTest(){
for (int i = 0; i < rows1; i++) {
RunnableInterface task = new New RunnableInterface(params);
Thread thread = new Thread(task);
thread.start();
threads.add(thread);
if ((threads.size() % 5 == 0) || ((i == rows1-1) && (threads.size() < 5))) {
waitForThreads(threads);
}
}
}
private static void waitForThreads(List<Thread> threads) {
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
threads.clear();
}

我需要做什么样的修改才能达到上面提到的结果

您可以使用具有无限制输入队列和固定线程数的ExecutorService,如下所示:

ExecutorService exec = Executors.newFixedThreadPool(5);
// As many times as needed:
for(int i = 0; i< 100_000; i++) {
Runnable myrunnable = () -> {}; // new RunnableInterface(params)
exec.submit(myrunnable);
}
exec.shutdown();
exec.awaitTermination(1, TimeUnit.DAYS);

在JDK19中,执行器服务是AutoClosable,因此可以简化为:

try (ExecutorService exec = Executors.newFixedThreadPool(5)) {
...
}

当有疑问时,将其分解为更小、更简单的函数:

public static void executeTest(){
for (int i = 0; i < rows1; i++) {
startFiveThreads(i);
awaitFiveThreads(i);
}
}
private static void startFiveThreads(int i) {
...
}
private static void awaitFiveThreads(int i) {
...
}

但说真的吗?我将为您的问题提供一个字面答案,这是实现解决方案的更好方法@DuncG为您展示了一个更好的问题解决方案当然要按照DuncG说的去做,但下次你试图实现一些棘手/复杂的算法时,也许还记得我说过的话。

最新更新