gpt4 book ai didi

java - 线程池不接受新任务

转载 作者:行者123 更新时间:2023-12-01 18:37:51 24 4
gpt4 key购买 nike

我感觉我的java并发知识已经生锈了,我试图弄清楚为什么线程池不接受以下代码中的更多任务:

ExecutorService e = Executors.newFixedThreadPool(aNumber);

// Task 1
for (int i=0; i<n; i++)
e.submit(new aRunnable());
while (!e.isTerminated());
System.out.println("Task 1 done");

// Task 2
for (int i=0; i<n; i++)
e.submit(new anotherRunnable());
while (!e.isTerminated());
System.out.println("Task 2 done");

它永远无法启动任务 2,当任务 1 中的最后一个任务运行时,线程会“卡住”,就像在等待其他任务完成一样。

出了什么问题?

最佳答案

It never gets to start Task 2, the thread "freezes" when the last task from Task 1 one is run like if it was waiting for something else to finish.

正在等待。 ExecutorService.isTermminate() 等待线程池任务在池关闭后完成。由于您从未调用过 e.shutdown(); ,因此您的循环将永远旋转。引用ExecutorService javadocs :

Returns true if all tasks have completed following shut down. Note that isTerminated is never true unless either shutdown or shutdownNow was called first.

您还没有关闭该服务,因此这永远不会是真的。一般来说,任何在 while 循环中旋转的东西都是反模式——至少在循环中放置一个 Thread.sleep(10); 。通常我们使用e.awaitTermination(...),但同样,这只是在您调用e.shutdown();之后。而且您不想关闭 ExecutorService,因为您将向其提交更多任务。

如果您想等待所有任务完成,然后提交更多任务,我会执行以下操作并在 Future 上调用 get()第一批提交任务返回的数据。像这样的东西:

List<Future> futures = new ArrayList<Future>();
for (int i = 0; i < n; i++) {
futures.add(e.submit(new aRunnable()));
}
// now go back and wait for all of those tasks to finish
for (Future future : futures) {
future.get();
}
// now you can go forward and submit other tasks to the thread-pool

关于java - 线程池不接受新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21101407/

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