- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我感觉我的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/
我想知道:是否有任何 API 或任何方式来访问 Windows 10 上的任务 View 功能窗口或矩形? Windows10 中的 C++ WinAPI 是否即将推出? 我需要在任务 View 模式
我是一名优秀的程序员,十分优秀!