Module  java.base
软件包  java.lang

Class Process



  • public abstract class Process
    extends Object
    Process提供了由ProcessBuilder.start和Runtime.exec启动的本机进程的控制。 该类提供了用于执行进程的输入,对进程的输出,等待进程完成,检查进程的退出状态以及销毁(杀死)进程的方法。 ProcessBuilder.start()Runtime.exec方法创建一个本机进程并返回一个Process子类的Process ,可以用于控制进程并获取有关它的信息。

    创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程,守护进程,Microsoft Windows上的Win16 / DOS进程或shell脚本。

    默认情况下,创建的进程没有自己的终端或控制台。 其所有的标准I / O(即标准输入,标准输出,标准错误)操作将被重定向到父进程,在那里他们可以经由使用所述方法获得的流进行访问getOutputStream()getInputStream() ,和getErrorStream() 父进程使用这些流将进程输入并从进程获取输出。 因为一些本地平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取进程的输出流可能会导致进程阻塞甚至死锁。

    在需要的地方, process I/O can also be redirected使用ProcessBuilder类的方法。

    当没有更多的引用Process对象时,进程不会被杀死,而是进程继续异步执行。

    不要求Process对象表示的进程与拥有Process对象的Java进程异步执行或并发。

    从1.5开始, ProcessBuilder.start()是创建Process的首选方式。

    过程的子类应覆盖onExit()toHandle()方法,以提供一个全功能的过程包括process idinformation about the processdirect childrendirect children plus descendants of those children的过程。 委托基础Process或ProcessHandle通常是最简单和最有效的。

    从以下版本开始:
    1.0
    • 构造方法详细信息

      • Process

        public Process​()
        Process的默认构造函数。
    • 方法详细信息

      • getOutputStream

        public abstract OutputStream getOutputStream​()
        返回连接到进程正常输入的输出流。 输出到流被管道输入到由该Process对象表示的进程的标准输入。

        如果使用ProcessBuilder.redirectInput重定向过程的标准输入,则此方法将返回一个null output stream

        实现注意事项:缓冲返回的输出流是一个好主意。

        结果
        输出流连接到进程的正常输入
      • getInputStream

        public abstract InputStream getInputStream​()
        返回连接到进程正常输出的输入流。 流从该Process对象表示的进程的标准输出中获取数据。

        如果进程的标准输出已使用ProcessBuilder.redirectOutput重定向,则此方法将返回一个null input stream

        否则,如果使用ProcessBuilder.redirectErrorStream重定向过程的标准错误,则此方法返回的输入流将接收合并的标准输出和进程的标准错误。

        实现注意事项:缓冲返回的输入流是一个好主意。

        结果
        输入流连接到正常输出的进程
      • getErrorStream

        public abstract InputStream getErrorStream​()
        返回连接到进程的错误输出的输入流。 流从该Process对象表示的进程的错误输出中获取数据。

        如果使用ProcessBuilder.redirectErrorProcessBuilder.redirectErrorStream重定向过程的标准错误,则此方法将返回一个null input stream

        实现注意事项:缓冲返回的输入流是一个好主意。

        结果
        输入流连接到进程的错误输出
      • waitFor

        public abstract int waitFor​()
                             throws InterruptedException
        导致当前线程等待,如有必要,直到此Process对象表示的进程已终止。 如果进程已经终止,此方法立即返回。 如果进程尚未终止,调用线程将被阻塞,直到进程退出。
        结果
        由该Process对象表示的进程的退出值。 按照约定,值0表示正常终止。
        异常
        InterruptedException - 如果当前线程正在等待时由另一个线程处理interrupted ,则等待结束,并抛出一个InterruptedException
      • waitFor

        public boolean waitFor​(long timeout,
                               TimeUnit unit)
                        throws InterruptedException
        导致当前线程等待,如有必要,直到此Process对象表示的进程已终止,或指定的等待时间过去。

        如果进程已经终止,那么该方法将立即返回值为true 如果进程尚未终止,超时值小于或等于零,则此方法将立即返回值为false

        此方法的默认实现轮询exitValue以检查进程是否已终止。 强烈建议此类的具体实现用更有效的实现来覆盖此方法。

        参数
        timeout - 等待的最长时间
        unit - timeout参数的时间单位
        结果
        true如果进程已经退出,并且 false如果在进程退出之前经过了等待时间。
        异常
        InterruptedException - 如果当前线程在等待时中断。
        NullPointerException - 如果单位为空
        从以下版本开始:
        1.8
      • exitValue

        public abstract int exitValue​()
        返回进程的退出值。
        结果
        由该Process对象表示的进程的退出值。 按照惯例,值0表示正常终止。
        异常
        IllegalThreadStateException - 如果此 Process对象表示的进程尚未终止
      • destroy

        public abstract void destroy​()
        杀死这个过程。 这个Process对象所表示的进程是否为normally terminated是否依赖于实现。 强制流程破坏被定义为流程的即时终止,而正常的终止允许流程干净地关闭。 如果该过程不存在,则不采取任何行动。

        所述CompletableFutureonExit()completed时的处理已终止。

      • destroyForcibly

        public Process destroyForcibly​()
        强制杀死进程。 Process对象表示的进程被强制终止。 强制流程破坏被定义为流程的即时终止,而正常的终止允许流程干净地关闭。 如果该过程不存在,则不采取任何行动。

        CompletableFutureonExit()completed当进程已经终止。

        ProcessBuilder.start()Runtime.exec(java.lang.String)返回的Process对象调用此方法强制终止进程。

        API Note:
        该过程可能不会立即终止。 isAlive()可能会在destroyForcibly()被调用后的destroyForcibly()返回true。 如果需要,该方法可以链接到waitFor()
        实现要求:
        此方法的默认实现将调用 destroy() ,因此可能不会强制终止进程。
        Implementation Note:
        强烈建议使用此类的具体实现来使用兼容实现覆盖此方法。
        结果
        代表进程强制销毁的 Process对象
        从以下版本开始:
        1.8
      • isAlive

        public boolean isAlive​()
        测试此 Process表示的过程是否存活。
        结果
        true如果此 Process对象表示的进程尚未终止。
        从以下版本开始:
        1.8
      • pid

        public long pid​()
        返回进程的本机进程ID。 本地进程ID是操作系统分配给进程的标识号。
        实现要求:
        该方法的实现将进程ID返回为: toHandle().pid()
        结果
        进程的本机进程标识
        异常
        UnsupportedOperationException - 如果Process实现不支持此操作
        从以下版本开始:
        9
      • onExit

        public CompletableFuture<Process> onExit​()
        返回一个CompletableFuture<Process>的终止进程。 CompletableFuture提供了在进程终止时触发可以同步或异步运行的从属功能或动作的功能。 当进程终止时,无论进程的退出状态如何,CompletableFuture为completed

        调用onExit().get()等待进程终止并返回进程。 未来可以用来检查进程是否为donewait ,以便终止。 Cancelling的CompletableFuture不会影响进程。

        ProcessBuilder.start()返回的进程重写默认实现,以提供一个有效的机制来等待进程退出。

        API Note:
        使用onExit是一种替代waitFor ,使两个额外的并发和所述处理的结果的方便访问。 Lambda表达式可用于评估流程执行的结果。 如果在使用该值之前要进行其他处理,则onExit是一种方便的机制,用于释放当前线程,只有当需要该值时才阻塞。
        例如,启动一个进程来比较两个文件,并得到一个布尔值,如果它们是相同的:
           Process p = new ProcessBuilder("cmp", "f1", "f2").start(); Future<Boolean> identical = p.onExit().thenApply(p1 -> p1.exitValue() == 0); ... if (identical.get()) { ... }  
        在ComputableFuture完成并调用依赖操作之前,该过程可能会被观察到已终止于isAlive()
        实现要求:
        该实现重复执行waitFor() ,直到它成功返回。 如果执行waitFor中断,线程的中断状态将被保留。

        waitFor()成功返回时,无论进程的退出状态如何,CompletableFuture为completed 如果同时等待大量进程,则该实现可能会消耗大量的线程堆栈内存。

        外部实现应该覆盖此方法并提供更有效的实现。 例如,要委托给基础进程,它可以执行以下操作:

           public CompletableFuture<Process> onExit() { return delegate.onExit().thenApply(p -> this); }  
        结果
        一个新的 CompletableFuture<Process>的过程
        从以下版本开始:
        9
      • info

        public ProcessHandle.Info info​()
        返回有关进程信息的快照。

        一个ProcessHandle.Info实例具有访问器方法,返回有关进程的信息(如果可用)。

        实现要求:
        此实现返回有关进程的信息: toHandle().info()
        结果
        关于进程的信息的快照,始终为非空
        异常
        UnsupportedOperationException - 如果Process实现不支持此操作
        从以下版本开始:
        9
      • children

        public Stream<ProcessHandle> children​()
        返回进程的直接子节点的快照。 直接子进程的父进程是进程。 通常, not alive的进程没有孩子。

        请注意,进程被创建并异步终止。 不能保证一个进程是alive

        实现要求:
        这个实现返回直接的孩子: toHandle().children()
        结果
        一个连续的ProcessHandles Stream,用于流程的直接子进程
        异常
        UnsupportedOperationException - 如果Process实现不支持此操作
        SecurityException - 如果已安装安全管理器,并且它拒绝RuntimePermission(“manageProcess”)
        从以下版本开始:
        9
      • descendants

        public Stream<ProcessHandle> descendants​()
        返回进程后代的快照。 一个进程的后代是进程的孩子加上那些孩子的后裔,递归地。 通常,一个进程是not alive没有孩子。

        请注意,进程被创建并异步终止。 不能保证一个进程是alive

        实现要求:
        这个实现返回所有的孩子,如: toHandle().descendants()
        结果
        用于进程的连续流ProcessHandles作为进程的后代
        异常
        UnsupportedOperationException - 如果Process实现不支持此操作
        SecurityException - 如果安全管理器已经安装,并且它拒绝RuntimePermission(“manageProcess”)
        从以下版本开始:
        9