我一直在尝试ProcessProcessBuilder并附带此SSCCE。

        import java.io.IOException;
        public class TestProcess {
            public static void main(String[] args) {
                Process process = null;
                ProcessBuilder pb = new ProcessBuilder("notepad.exe");

                try {
                    process = pb.start();
                } catch (IOException e) {e.printStackTrace();}

                //have some time to close notepad
                try {
                    Thread.sleep(10*1000);
                } catch (InterruptedException ignored) {}

                try {
                    System.out.println(process.exitValue());
                 } catch (IllegalThreadStateException e) {
                    System.out.println(e);
                 }

                 if (process != null)
                     process.destroy();

                 /*try {
                     Thread.sleep(0, 1);
                 } catch (InterruptedException ignored) {}*/

                 System.out.println(process.exitValue());
             }
         }
  • 如果我运行此代码并在10s超时前关闭记事本。尝试停止已终止的进程时,destroy()调用不显示任何问题。 为什么?
  • 如果运行此代码并且根本不关闭记事本(带有第二次 sleep 注释)

  • 看来destroy是异步调用(仅发送信号吗?),这导致第二个exitValue()中的异常
     java.lang.IllegalThreadStateException: process has not exited
     Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
            at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
            at TestProcess.main(TestProcess.java:30)
    
  • 如果我运行此代码并且根本不关闭记事本(第二次 sleep 未注释),则第二个exitValue永远不会引发Exception,即使 sleep 值仅为1ms。 是因为sleep()开销本身吗?
    第二个exitValue将返回1.

  • PS。我从Windows 7和Eclipse运行它。

    最佳答案

  • 为什么会出现问题?您正在尝试破坏已经被破坏的进程。 Process.destroy()的规范没有说明如果没有要破坏的东西会发生什么,所以逻辑上(我想)是假设没有东西要破坏的话,也没有什么可提示的。与Thread.join()进行比较,它不仅会在线程已经结束时终止。
  • 杀死进程的唯一方法是向其发送信号。在某些OS上,还有其他更“暴力”的方式(例如,在某些平台上,可以从OS的正在运行的进程列表中删除该进程。结果是不确定的,并且通常以丑陋的方式结束),但至少在我所知道的平台上,实际上就是发送信号。
  • 实际上,可能是因为调用Thread.sleep()需要时间。尝试增加超时值。
  • 关于java - Process.exitValue()和Process.destroy()功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13972442/

    10-09 08:57