例如,如果我有一个由 10 个线程组成的池,并且这些线程出去并启动不同的进程(perl 脚本),是否有办法让这些线程“检查”这些脚本以查看它们的运行情况?
有时某些脚本会冻结,我无法知道。所以我一直在想一种方法让线程每隔一段时间检查一次脚本,这样我就可以在脚本挂起时收到通知,这样我就可以开始弄清楚它们挂起的原因并解决问题。
例如,如果我有一个由 10 个线程组成的池,并且这些线程出去并启动不同的进程(perl 脚本),是否有办法让这些线程“检查”这些脚本以查看它们的运行情况?
有时某些脚本会冻结,我无法知道。所以我一直在想一种方法让线程每隔一段时间检查一次脚本,这样我就可以在脚本挂起时收到通知,这样我就可以开始弄清楚它们挂起的原因并解决问题。
例如,如果我有一个由 10 个线程组成的池,并且这些线程出去并启动不同的进程(perl 脚本),是否有办法让这些线程“检查”这些脚本以查看它们的运行情况?
我知道的唯一方法是脚本本身每 X 秒输出某种状态消息到标准输出或错误,并且生成脚本的线程正在积极读取,等待输出。然后它可以更新有关进程的状态信息。
如果您使用ProcessBuilder
and 调用start()
来获取 a Process
,那么您可以将 a 附加BufferedReader
到process.getOutputStream()
以监视脚本。您当然也可以打电话process.exitValue()
来查看该过程是否已完成,但这不会告诉您它是否已挂起。
或者,脚本可以通过套接字或其他 IPC 以某种方式回调监视进程,但我认为仅监视输出流是最好的方法。
实际上,正如我在评论中发布的那样,知道程序是否“挂起”是一个无法确定(无法解决)的问题,称为停止问题。因此,不能对此进行验证。
isAlive()
一些替代解决方案是通过调用正在运行脚本的对象上的方法来检查脚本是否仍在运行Thread
,或者,如其他答案中所述,检查脚本可能给出的一些输出,并解释它. 但不幸的是,通过验证输出,您无法确定程序是否“挂起”,您只能知道它的当前状态。
编辑:如果你想等待一个特定的时间,那么你可以使用Thread.sleep(long millis)
父母的电话,当它醒来时,再次检查谁还活着isAlive()
。但这并不能保证程序实际上会完成