特定时间后的终止进程(Java)



我想要一种机制,通过这种机制,预期的进程不应该运行超过特定的时间。特定时间结束后,应显示进程是否正在运行的状态,并且进程不应再运行。

为此,我尝试制作两个类ExecuteCheckExecute对象的run方法将执行进程。Check对象将休眠特定时间,之后检查Execute的对象是否仍在运行。如果它正在运行Check,则对象将终止该线程并打印"是"。否则,Check对象应打印"否"。

class Execute extends Thread{
public void run(){
//Execute process
}
public static void main(String[] args){
Execute ex = new Execute();
ex.start();
Check ch = new Check(ex);
ch.start();
}
}
class Check extends Thread{
Execute ex;
Check(Execute ex){
this.ex = ex;
}
public void run(){
try{Thread.sleep(5000);} //specific time given is 5 seconds.
catch(Exception e){System.out.println(e);}
if(ex.isAlive()){
System.out.println("yes");
//kill the thread ex.
}
else System.out.println("no");
}
}

我的问题是:

  • 如何杀死ex线程
  • 实施这一机制的最佳方式是什么

在Java中没有100%安全的方法。

建议的方法是中断执行线程

if(ex.isAlive()){
System.out.println("yes");
//kill the thread ex.
ex.interrupt()
}

但要做到这一点,在Execute run()方法逻辑中,您需要检查interrupted()是否返回true,如果返回true,则停止计算(例如,如果您的run方法在循环中执行某些操作,则循环中的第一个语句可以进行检查。中断还会破坏所有的"阻塞"操作,如wait()、sleep()、IO操作,因此它会影响您的"代码",并将其称为"系统"方法(这就是为什么sleep抛出InterruptedException)。

然而,您需要控制run()方法代码,以添加必要的检查并停止其执行。

停止线程的核心方法是调用

ex.stop()

正如您在JavaDoc中看到的那样,它是不推荐使用的,通常不应该使用,因为它可能会引起问题(请阅读文档)。但这是停止执行您无法控制的代码的线程的唯一方法。

我的方法是,首先中断,等待它是否工作,如果没有强制停止线程。

if(ex.isAlive()){
System.out.println("yes");
//kill the thread ex.
ex.interrupt();
ex.join(100); //give the ex thread chance to stop in a clean way
if (ex.isAlive()) {
ex.stop();
}
}

首先是一些背景信息,我在运行命令时遇到了超时的问题,因为我尝试执行的程序在出现错误时永远不会打印任何调试或错误信息,只会在内部继续重试,导致进程停滞,因为重试时从未出现错误或输出流。

所以在process.exec()process.start()之后,

它将永远卡在这条线上,

BufferedReader input = new BufferedReader(newInputStreamReader(process.getInputStream()));

根据带有public boolean waitFor(long timeout,TimeUnit unit)方法的java 1.8,它应该在指定的超时后"理想地"超时,但在我的情况下,由于某种原因,它从未超时,可能是因为我将应用程序作为windows服务运行(我已经检查了用户权限和帐户上的所有内容,但没有帮助)。

因此,我尝试用下面的逻辑来实现它,在这里我们将继续使用input.ready()和超时标志来检查输入流。与现有的所有解决方案相比,这个简单的解决方案就像一种魅力。

请参阅以下代码:

https://stackoverflow.com/a/33265110/1212036

最新更新