我正在尝试在我的java程序中实现一种中断过程,这样如果一个操作需要超过5分钟,我就可以杀死它。
我能做到这一点的通用方式吗?我正在使用外部API执行非常耗费处理器的计算,并且它已经多线程处理过程,所以我仍然可以使用执行程序类来执行此操作吗?
-edit -
使用bash脚本包装函数结束解决它。它会在超时后终止PID。
答案 0 :(得分:3)
杀死或强制停止线程被认为是不安全的,因为它可能使程序处于未确定状态,这将导致崩溃或其他更严重的问题。相反,您应该设计工作线程以定期通过Thread#isInterrupted或Thread#interrupted检查中断标志,如果已设置则退出。然后,使用另一个线程,您可以通过调用工作线程上的interrupt()来向工作线程发出信号,告知它应该停止,这将导致工作线程检测到中断,或者如果它在代码内部阻塞,则可能会收到InterruptedException。第三方代码。
答案 1 :(得分:1)
根据线程的编码方式(即中断时是否正确终止),您可以使用提供的Thread.join(millis)或Thread.join(mills,nanos)方法调用。
这样的事情:
Thread myThread
// ... start myThread
myThread.join(300000); // 5mins in millis
if (myThread.isAlive()) {
myThread.interrupt();
}
在线程本身内部,您需要确保相关点处的.yield()并正确处理InterruptedException以允许此类逻辑工作。
当然这是一个“理想”的情况 - 如果线程由于某些外部进程而被阻塞,并且无法处理.interrupt(),那么它将无法正常工作。
HTH