【问题标题】:Can a thread in java monitor processes that it starts?java中的线程可以监视它启动的进程吗?
【发布时间】:2013-06-25 13:30:39
【问题描述】:

例如,如果我有一个由 10 个线程组成的池,并且这些线程出去并启动不同的进程(perl 脚本),是否有办法让这些线程“检查”这些脚本以查看它们的运行情况?

有时某些脚本会冻结,我无法知道。所以我一直在想一种方法让线程每隔一段时间检查一次脚本,这样我就可以在脚本挂起时收到通知,这样我就可以开始弄清楚它们挂起的原因并解决问题。

【问题讨论】:

  • 知道程序是否“挂起”是一个无法确定(无法解决)的问题,称为“停止问题”。也许你想监控一些更具体的东西?
  • 我的想法是检查进程运行了多长时间。如果它的运行时间超过 X 小时,我会采取一些措施
  • 当我提出这个建议时,我的编译器教授问我:“如果你再等一会儿?”
  • 脚本输出到标准输出或标准错误并且您的 java 程序不读取输出可能是您的脚本挂起的原因。 link

标签: java multithreading


【解决方案1】:

例如,如果我有一个由 10 个线程组成的池,并且这些线程出去并启动不同的进程(perl 脚本),是否有办法让这些线程“检查”这些脚本以查看它们的运行情况?

我知道的唯一方法是脚本本身每隔 X 秒输出某种状态消息到标准输出或错误,并且生成脚本的线程正在积极读取,等待输出。然后它可以更新有关进程的状态信息。

如果您使用ProcessBuilder 并调用start() 来获取Process,那么您可以将BufferedReader 附加到process.getOutputStream() 以监控脚本。您当然也可以致电process.exitValue() 来查看进程是否已完成,但不会告诉您它是否已挂起。

另一种方法是让脚本通过套接字或其他 IPC 以某种方式回调监视进程,但我认为仅监视输出流是最好的方法。

【讨论】:

  • 我认为检查process.exitValue() 是我正在寻找的。我知道理论上我永远无法知道进程是否挂起,但就我而言,我可以非常确定几个小时后我的进程是否还没有完成而不是出现问题。
【解决方案2】:

实际上,正如我在评论中发布的那样,知道程序是否“挂起”是一个无法确定(无法解决)的问题,称为The halting problem。因此,不能对此进行验证。

一些替代解决方案是通过在运行脚本的Thread 对象上调用isAlive() 方法来检查脚本是否仍在运行,或者,如其他答案中所述,检查某些输出脚本可能会给出并解释它。但不幸的是,通过验证输出,您无法确定程序是否“挂起”,您只能知道它的当前状态。

编辑:如果你想等待一个特定的时间,那么你可以在父级上使用Thread.sleep(long millis) 调用,当它醒来时,再次使用isAlive() 检查谁还活着。但这并不能保证程序会真正完成

【讨论】:

  • 什么类支持isAlive()?你在说Thread
  • @Gray 是的.. 这是一种您可以在 Thread 对象上调用的方法
  • 停机问题与此无关。停止问题表明您无法决定任意算法是否永远运行。这个问题是不同的。他处理的特定脚本在理论上可以决定在给定的输入上是否停止(或真的无法确定),但特别是已经预料到的运行时间。如果“仍然在 X 之后奔跑”是他想做的充分标准,那么它就是。
  • @b.buchhold OP 自称Sometimes some of the scripts freeze up and I have no way of knowing,这表明他没有明确的参数来决定何时冻结脚本..
  • 对我来说,知道 X 小时后是否需要做某事就足够了。我不能让脚本继续运行,因为我不知道它们是否被冻结
猜你喜欢
  • 2010-09-11
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多