gpt4 book ai didi

java - 如何在 Java 中使用线程池并重新加入线程?

转载 作者:行者123 更新时间:2023-11-29 07:59:36 24 4
gpt4 key购买 nike

所以问题是我有一个执行计算密集型任务的对象。

假设主类有两个这样的对象,我将过程并行化如下。

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
obj1.compute();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
obj2.compute();
}
});

t1.start();
t2.start();
t1.join();
t2.join();

但是如果我有任意数量的对象,存储在一个列表中,最好的方法是什么? (假设数量级为 10)。我正在研究执行程序服务,但不知道如何重新加入线程。 ForkJoinPool 应该可以做到这一点,但我找不到如何让它工作。

我的首要任务是简单、清晰的代码,而不是性能(因为在计算所需的 10 分钟内,任何开销都看不到)。

最佳答案

您可以简单地尝试对返回的 futures 调用 get,这将阻塞直到任务完成。例如:

ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future> futures = new ArrayList<> ();

for (Runnable r : yourListOfRunnables) {
futures.add(executor.submit(r));
}

//now do the equivalent of join:

try {
for (Future f : futures) {
f.get(); //blocks until the runnable completes
}
} catch (...) { }

注意:不要忘记在完成后关闭执行器,否则它可能会阻止您的应用程序退出。

或者,如果这是一次性的事情,您可以关闭执行程序并等待它终止:

ExecutorService executor = Executors.newFixedThreadPool(10);

for (Runnable r : yourListOfRunnables) {
executor.submit(r);
}

executor.shutdown(); //do not accept more tasks
executor.awaitTermination(Long.MAX_VALUE, SECONDS); //waits until all tasks complete

//at this point: all tasks have completed and
//your executor is terminated: you can't reuse it

关于java - 如何在 Java 中使用线程池并重新加入线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15255815/

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