模块  java.base
软件包  java.lang

Class Process


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

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

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

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

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

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

    自1.5起, ProcessBuilder.start()是创建Process的首选方式。

    过程的子类应覆盖onExit()toHandle()方法,以提供一个全功能的过程包括process idinformation about the processdirect children ,和direct 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 - 如果unit为null
        从以下版本开始:
        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()后的短暂时间内返回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()
        结果
        进程的本机进程ID
        异常
        UnsupportedOperationException - 如果Process实现不支持此操作
        从以下版本开始:
        9
      • onExit

        public CompletableFuture<Process> onExit()
        返回CompletableFuture<Process>以终止进程。 CompletableFuture提供了触发可能在进程终止时同步或异步运行的相关功能或操作的功能。 当进程终止时,无论进程的退出状态如何,CompletableFuture都是completed

        调用onExit().get()等待进程终止并返回进程。 未来可用于检查进程是done还是wait以终止进程。 Cancelling CompletableFuture不会影响流程。

        ProcessBuilder.start()返回的进程将覆盖默认实现,以提供等待进程退出的有效机制。

        API Note:
        使用onExit是一种替代waitFor ,它使两个额外的并发和所述处理的结果的方便访问。 Lambda表达式可用于评估Process执行的结果。 如果在使用该值之前还有其他处理要进行,那么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()
        结果
        有关进程的信息快照,始终为非null
        异常
        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的顺序Stream,用于进程后代的进程
        异常
        UnsupportedOperationException - 如果Process实现不支持此操作
        SecurityException - 如果安装了安全管理器并且它拒绝RuntimePermission(“manageProcess”)
        从以下版本开始:
        9