gpt4 book ai didi

java - 如何监控线程的生命周期?

转载 作者:行者123 更新时间:2023-12-02 07:51:46 24 4
gpt4 key购买 nike

我想知道是否有一种方法可以监视线程的生命周期,但我会解释我正在做的事情的上下文,所以也许有更好的方法来做到这一点。

基本上,我有 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/

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