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