- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否有一种方法可以监视线程的生命周期,但我会解释我正在做的事情的上下文,所以也许有更好的方法来做到这一点。
基本上,我有 x 个线程正在队列上工作并处理它,如果线程获得可接受的结果,它将进入解决方案队列,否则数据将被丢弃或进一步处理。
我的问题是在我的主线程中,我有一个类似的 while(!solutions_results.isEmpty())
,它保存数据(现在它打印到文件,但稍后可能打印到数据库)。明显的问题是,一旦它清除了解决方案队列,它就完成并完成工作,即使其他线程仍在将数据放入队列中。
我不确定处理这个问题的最佳方法(也许有一个专用线程只保存解决方案队列?)但我在想如果我可以以某种方式监视其他线程的生命周期,那么就没有机会更多数据进入解决方案队列。
如果有更好的方法来做到这一点,请告诉我,否则有没有办法告诉其他线程完成后(我等不及执行程序在运行此进程之前完全完成,因为它可能会变得相当大并且不希望它只是坐在内存中,理想情况下希望在接近它进入时处理它,但它不依赖于时间)?
最佳答案
如果您使用 ExecutorService
来运行线程作业,那么您可以使用 awaitTermination()
方法来了解所有线程何时完成:
ExecutorService pool = Executors.newFixedThreadPool(10);
pool.submit(yourSolutionsRunnable);
pool.submit(yourSolutionsRunnable);
...
// once you've submitted your last job you can do
pool.shutdown();
然后您可以等待所有提交的作业完成:
pool.waitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
如果您的线程在提交解决方案后需要继续运行,这会变得更加复杂。如果您编辑您的问题并使这一点更加明显,我将编辑我的答案。
<小时/>编辑:
哦,我发现您想要一路处理一些结果,但在所有线程完成之前不要停止。
您可以使用pool.isTermminate()
测试来告诉您是否所有作业都已完成。所以你的循环看起来像这样:
// this is the main thread so waiting for solutions in a while(true) loop is ok
while (true) {
// are all the workers done?
if (pool.isTerminated()) {
// if there are results process one last time
if (!solutions_results.isEmpty()) {
processTheSolutions();
}
break;
} else {
if (solutions_results.isEmpty()) {
// wait a bit to not spin, you could also use a wait/notify here
Thread.sleep(1000);
} else {
processTheSolutions();
}
}
}
编辑:
您还可以有两个线程池,一个用于生成解决方案,另一个用于处理。然后,您的主线程可以等待工作池清空,然后等待解决方案处理池。工作池将解决方案(如果有)提交到解决方案池中。您可以在解决方案处理池中只拥有 1 个线程,也可以根据需要拥有更多线程。
ExecutorService workerPool = Executors.newFixedThreadPool(10);
final ExecutorService solutionsPool = Executors.newFixedThreadPool(1);
solutionsPool.submit(workerThatPutsSolutionsIntoSolutionsPool);
...
// once you've submitted your last worker you can do
workerPool.shutdown();
workerPool.waitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
// once the workers have finished you shutdown the solutions pool
solutionsPool.shutdown();
// and then wait for it to finish
solutionsPool.waitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
关于java - 如何监控线程的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10145161/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!