例如,如果我有一个包含10个线程的池并且这些线程出去并启动不同的进程(perl脚本),那么这些线程是否可以“检查”这些脚本以查看它们是如何进行的?
有时一些脚本冻结,我无法知道。所以我一直在考虑让线程每隔一段时间检查一次脚本的方法,这样我就可以在脚本挂起时得到通知,以便我可以开始弄清楚它们为什么挂断并解决问题。
答案 0 :(得分:4)
例如,如果我有一个包含10个线程的池并且这些线程出去并启动不同的进程(perl脚本),那么这些线程是否可以“检查”这些脚本以查看它们是如何进行的?
我知道这样做的唯一方法是,如果脚本本身每隔X秒向标准输出或错误输出某种状态消息,则产生脚本的线程正在主动读取,等待输出。然后,它可以更新有关该过程的状态信息。
如果您使用ProcessBuilder
并致电start()
来获取Process
,那么您可以将BufferedReader
附加到process.getOutputStream()
以监控脚本。您当然也可以调用process.exitValue()
来查看该过程是否已完成,但不会告诉您它是否挂起。
另一种方法是脚本以某种方式通过套接字或其他IPC回调监控过程,但我认为监控输出流是最好的方法。
答案 1 :(得分:1)
实际上,正如我在评论中发表的那样,知道一个程序是否“挂起”是一个名为The halting problem的不可判定(无法解决)的问题。因此,不能对此进行验证。
一些替代解决方案是通过调用运行该脚本的isAlive()
对象上的Thread
方法来检查脚本是否仍在运行,或者如在其他答案中所述,检查脚本是否仍在运行对于脚本可能给出的一些输出,并解释它。但遗憾的是,通过验证输出,您无法确定程序是否“挂起”,您只能知道它的当前状态。
编辑:如果您想等待特定时间,那么您可以对父母进行Thread.sleep(long millis)
调用,当它唤醒时,再次使用{{检查谁还活着1}}。但这并不能保证程序真正完成