我正在主程序中运行一个生成数据的方法,并且还 fork 了一个线程来监视该方法正在写入的队列,如果有数据,则将其保存到磁盘。
我的问题是过去我会对其进行多线程处理,并且能够监视其他线程的生命周期,但我不确定如果它只是 main 方法该怎么做?该方法的问题是生成数据缓慢,并且一旦清空队列,使用 sleep 或 !queue.empty() 就无法工作, fork 文件编写器进程就会停止。
我知道最坏的情况我可以在生成数据的方法中写入文件,但除此之外我可以做些什么来监视另一个方法是否仍在执行?
最佳答案
听起来对于 ExecutorService
来说是一份不错的工作。在您的主方法中创建它:
ExecutorService pool = Executors.newFixedThreadPool(10);
ExecutorService
基本上是一个队列和一组等待该队列的线程的包装器(在上面的示例中为 10 个)。当某些内容出现在队列中(已提交)时,只有一个线程会拾取它:
pool.submit(someWork);
其中 someWork
是一个 Runnable,例如包装要写入磁盘的数据和写入过程。当您在主线程中完成后,您只需要求池
正常终止:
pool.shutdown();
pool.awaitTermination(60, TimeUnit.SECONDS);
此代码将等待 60 秒,以便其他线程完成并处理队列中的所有项目。
向我们展示更多代码,我可以帮助您重构它。如果您不想走那么远,某些 Java 集合中的某些方法会在队列为空时阻塞,并在出现某些内容时唤醒线程。
关于java - 有没有办法判断程序是否仍在运行某个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10807117/