Java 有没有办法判断程序是否仍在运行某个方法?

Java 有没有办法判断程序是否仍在运行某个方法?,java,Java,我正在从main运行一个方法,该方法生成数据,我还分叉一个线程,该线程监视该方法正在写入的队列,如果有数据,它会将其保存到磁盘 我的问题是,在过去,我会多线程执行它,并且能够监视其他线程的生命周期,但如果它只是主要方法,我不确定如何执行?该方法的问题是生成数据的速度慢,并且使用sleep或!queue.empty()在清空队列后不工作,分叉文件编写器进程停止 我知道在最坏的情况下,我可以在生成数据的方法中写入文件,但除此之外,我还可以做些什么来监视另一个方法是否仍在执行?对于一个用户来说,这听起

我正在从main运行一个方法,该方法生成数据,我还分叉一个线程,该线程监视该方法正在写入的队列,如果有数据,它会将其保存到磁盘

我的问题是,在过去,我会多线程执行它,并且能够监视其他线程的生命周期,但如果它只是主要方法,我不确定如何执行?该方法的问题是生成数据的速度慢,并且使用sleep或!queue.empty()在清空队列后不工作,分叉文件编写器进程停止


我知道在最坏的情况下,我可以在生成数据的方法中写入文件,但除此之外,我还可以做些什么来监视另一个方法是否仍在执行?

对于一个用户来说,这听起来是个不错的工作。在主方法中创建它:

ExecutorService pool = Executors.newFixedThreadPool(10);
ExecutorService
基本上是一个围绕队列和等待该队列的一组线程的包装器(在上面的示例中为10个)。当队列中出现(提交)某个内容时,正好有一个线程将其拾取:

pool.submit(someWork);
其中
someWork
是可运行的,例如包装要写入磁盘的数据和写入过程。在主线程中完成后,只需请求
优雅地终止:

pool.shutdown();
pool.awaitTermination(60, TimeUnit.SECONDS);
此代码将等待60秒,等待其他线程完成并处理队列中的所有项目


向我们展示更多的代码,我可以帮助您重构它。如果您不想走那么远,有些Java集合中的方法会在队列为空时阻塞,并在出现某些内容时唤醒线程。

您还可以使用该命令打印JVM线程的堆栈跟踪。

您是否使用
LinkedBlockingQueue
?这将阻止调用方,直到队列中添加了某些内容,这样当队列为空时,文件编写器不会停止。您可以使用
LinkedBockingQueue
并将一些特殊对象排入队列,以指示您的进程已完成向队列添加数据的操作。您说
fork
是一个线程,这毫无意义,真的:您是
fork
正在运行一个新进程还是
thread.start()
正在运行一个新线程?这使得相关答案有了巨大的差异…@MattCrinklaw Vogt intresting,他不知道这一点。我使用的是ArrayBlockingQueue,但我可以试一试LinkedBlockingQueue。@Matt我正在做
thread.start()那么ArrayBlockingQueue和LinkedBlockingQueue都应该具有相同的接口。“ArrayBlockingQueue.take”方法是一种将暂停调用线程的方法,直到有东西添加到队列中。谢谢Tomasz。我知道怎么做,我认为这是个好主意。因为我只运行了一个线程,我没有想到这一点。谢谢,我会尝试一下。