特定时间后的杀戮过程(Java)

时间:2015-04-26 09:23:03

标签: java multithreading concurrency process

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

为此,我尝试制作两个类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帖子?
  • 实施此机制的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

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

推荐的方法是中断执行线程

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

但为了工作,在你的Execute run()方法逻辑中你需要检查interrupted()是否返回true,如果是,则停止计算(例如,如果你的run方法在循环中执行某些操作,首先循环中的语句可以进行检查。 中断也将打破所有"阻止" wait(),sleep(),IO操作等操作,因此它会影响你的"代码"让他们称呼他们" system"方法(这就是为什么例如睡眠抛出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();
        }
}

答案 1 :(得分:0)

首先是一些背景信息,我遇到了在运行命令时超时的问题,因为我尝试执行的程序永远不会打印出任何错误的调试或错误信息,并且会继续自行重试因为在重试时从未出现过错误或输出流,因此进程陷入困境。

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