Process.exitValue()和Process.destroy()功能

Nik*_*sov 8 java windows process processbuilder

我一直在尝试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());
             }
         }
Run Code Online (Sandbox Code Playgroud)
  1. 如果我在10秒超时之前运行此代码并关闭记事本.destroy()在尝试停止已经终止的进程时,调用没有显示任何问题.为什么?
  2. 如果运行此代码并且根本不关闭记事本(使用注释的第二次睡眠)

似乎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)
Run Code Online (Sandbox Code Playgroud)
  1. 如果我运行此代码并且根本没有关闭记事本(使用未注释的第二次休眠),则第二次exitValue永远不会抛出异常,即使睡眠值仅为1ms.是因为sleep()开销本身吗? 第二个exitValue会返回1.

PS.我从Windows 7和Eclipse运行它.

Isa*_*aac 1

  1. 为什么显示出问题呢?您正试图破坏一个已经被破坏的进程。的规范并Process.destroy()没有说明如果没有什么可以破坏的话会发生什么,所以(我想)假设如果没有什么可以破坏,那么就没有什么可抱怨的。与 相比Thread.join(),如果线程已经结束,它不会直接死亡。

  2. 终止进程的唯一方法是向其发送信号。在某些操作系统上,还有其他更“暴力”的方法(例如,在某些平台上,可以简单地从操作系统的正在运行的进程列表中删除该进程。结果是未定义的,并且通常会以丑陋的方式结束),但至少据我所知,平台的关键在于发送信号。

  3. 事实上,这可能是因为调用Thread.sleep(). 尝试增加超时值。