特定时间后终止进程(Java)
我希望有一种机制,通过这种机制,预期进程的运行时间不应超过特定的时间。在特定时间结束后,应显示进程是否正在运行以及进程是否应不再运行的状态 为此,我尝试让两个类执行和检查,Execute对象的run方法将执行这个过程。Check对象将在特定时间内休眠,然后检查Execute对象是否仍在运行。若它正在运行,则检查对象是否希望终止该线程并打印“是”。否则,检查对象应打印否特定时间后终止进程(Java),java,multithreading,concurrency,process,Java,Multithreading,Concurrency,Process,我希望有一种机制,通过这种机制,预期进程的运行时间不应超过特定的时间。在特定时间结束后,应显示进程是否正在运行以及进程是否应不再运行的状态 为此,我尝试让两个类执行和检查,Execute对象的run方法将执行这个过程。Check对象将在特定时间内休眠,然后检查Execute对象是否仍在运行。若它正在运行,则检查对象是否希望终止该线程并打印“是”。否则,检查对象应打印否 class Execute extends Thread{ public void run(){
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");
}
}
我的问题是:
我怎样才能杀死前线程?
实施这一机制的最佳方式是什么?
在Java中没有100%安全的方法 建议的方法是中断执行线程
if(ex.isAlive()){
System.out.println("yes");
//kill the thread ex.
ex.interrupt()
}
但是为了实现这一点,在您的Execute-run方法逻辑中,您需要检查interrupted是否返回true,如果返回true,则停止计算。例如,如果您的run方法在循环中执行某些操作,则循环中的第一个语句可以执行该检查。
中断还会中断所有阻塞操作,如等待、睡眠、IO操作,因此它会影响代码,让我们将它们称为系统方法,这就是为什么睡眠会抛出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=新建BufferedReadernewInputStreamReaderprocess.getInputStream 根据java 1.8和public boolean waitForlong timeout,TimeUnit方法,理想情况下,它应该在指定的超时后超时,但在我的情况下,由于某种原因,它从未超时,可能是因为我将应用程序作为windows服务运行,我检查了用户权限和帐户上的所有内容,但它没有帮助 所以我尝试用下面的逻辑来实现它,在这里我们将使用input.ready和超时标志来检查输入流。与所有其他存在的解决方案相比,这个简单的解决方案非常有魅力 请参阅下面的代码: 可能重复。请阅读具有销毁方法的。