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

特定时间后终止进程(Java),java,multithreading,concurrency,process,Java,Multithreading,Concurrency,Process,我希望有一种机制,通过这种机制,预期进程的运行时间不应超过特定的时间。在特定时间结束后,应显示进程是否正在运行以及进程是否应不再运行的状态 为此,我尝试让两个类执行和检查,Execute对象的run方法将执行这个过程。Check对象将在特定时间内休眠,然后检查Execute对象是否仍在运行。若它正在运行,则检查对象是否希望终止该线程并打印“是”。否则,检查对象应打印否 class Execute extends Thread{ public void run(){

我希望有一种机制,通过这种机制,预期进程的运行时间不应超过特定的时间。在特定时间结束后,应显示进程是否正在运行以及进程是否应不再运行的状态

为此,我尝试让两个类执行和检查,Execute对象的run方法将执行这个过程。Check对象将在特定时间内休眠,然后检查Execute对象是否仍在运行。若它正在运行,则检查对象是否希望终止该线程并打印“是”。否则,检查对象应打印否

 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和超时标志来检查输入流。与所有其他存在的解决方案相比,这个简单的解决方案非常有魅力

请参阅下面的代码:

可能重复。请阅读具有销毁方法的。