我正在从我的 main 运行一个生成数据的方法,并且我还派生了一个线程,该线程监视该方法正在写入的队列,如果有数据,它会将其保存到磁盘。
我的问题是过去我会多线程它并且能够监视其他线程的生命但是我不确定如果它只是主要方法该怎么做?该方法生成数据缓慢并且使用 sleep 或 !queue.empty() 的问题一旦清空分叉文件写入器进程停止的队列就不起作用。
我知道最坏的情况是我可以在生成数据的方法中写入文件,但除此之外,我还能做些什么来监控是否仍在执行另一种方法?
我正在从我的 main 运行一个生成数据的方法,并且我还派生了一个线程,该线程监视该方法正在写入的队列,如果有数据,它会将其保存到磁盘。
我的问题是过去我会多线程它并且能够监视其他线程的生命但是我不确定如果它只是主要方法该怎么做?该方法生成数据缓慢并且使用 sleep 或 !queue.empty() 的问题一旦清空分叉文件写入器进程停止的队列就不起作用。
我知道最坏的情况是我可以在生成数据的方法中写入文件,但除此之外,我还能做些什么来监控是否仍在执行另一种方法?
听起来对一个ExecutorService
. 在您的主要方法中创建它:
ExecutorService pool = Executors.newFixedThreadPool(10);
ExecutorService
基本上是一个队列和一组在该队列上等待的线程的包装器(上面示例中的 10 个)。当队列中出现某些内容(已提交)时,恰好有一个线程将其拾取:
pool.submit(someWork);
Runnable在哪里someWork
,例如包装要写入磁盘的数据和写入过程。在主线程中完成后,您只需要求pool
优雅地终止:
pool.shutdown();
pool.awaitTermination(60, TimeUnit.SECONDS);
此代码将等待 60 秒以等待其他线程完成并处理队列中的所有项目。
向我们展示更多代码,我可以帮助您重构它。如果您不想走那么远,一些 Java 集合中的一些方法会在队列为空时阻塞,并在出现某些内容时唤醒线程。
您还可以使用jstack命令打印 JVM 线程的堆栈跟踪。