- java.lang.Object
-
- java.lang.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 id , information about the process , direct children ,和direct children plus descendants of those children的过程。 委派给基础Process或ProcessHandle通常是最简单和最有效的。- 从以下版本开始:
- 1.0
-
-
构造方法摘要
构造方法 构造器 描述 Process()
Process的默认构造函数。
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 Stream<ProcessHandle>
children()
返回进程的直接子节点的快照。Stream<ProcessHandle>
descendants()
返回进程后代的快照。abstract void
destroy()
杀死这个过程。Process
destroyForcibly()
强行杀死这个过程。abstract int
exitValue()
返回进程的退出值。abstract InputStream
getErrorStream()
返回连接到进程错误输出的输入流。abstract InputStream
getInputStream()
返回连接到进程正常输出的输入流。abstract OutputStream
getOutputStream()
返回连接到进程正常输入的输出流。ProcessHandle.Info
info()
返回有关该进程的信息的快照。boolean
isAlive()
测试此Process
表示的进程是否存活。CompletableFuture<Process>
onExit()
返回CompletableFuture<Process>
以终止进程。long
pid()
返回进程的本机进程ID。boolean
supportsNormalTermination()
ProcessHandle
toHandle()
返回Process的ProcessHandle。abstract int
waitFor()
如有必要,导致当前线程等待,直到此Process
对象表示的进程终止。boolean
waitFor(long timeout, TimeUnit unit)
如果需要,使当前线程等待,直到此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.redirectError
或ProcessBuilder.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是否依赖于实现。 强制进程销毁被定义为进程的立即终止,而正常终止允许进程干净地关闭。 如果进程不活动,则不执行任何操作。所述
CompletableFuture
从onExit()
是completed当过程已经终止。
-
destroyForcibly
public Process destroyForcibly()
强行杀死这个过程。 此Process
对象表示的进程被强制终止。 强制进程销毁被定义为进程的立即终止,而正常终止允许进程干净地关闭。 如果进程不活动,则不执行任何操作。所述
CompletableFuture
从onExit()
是completed当过程已经终止。在由
ProcessBuilder.start()
和Runtime.exec(java.lang.String)
返回的Process
对象上调用此方法会强制终止该进程。- API Note:
-
该过程可能不会立即终止。
即
isAlive()
可能会在destroyForcibly()
后的短暂时间内返回true。 如果需要,此方法可以链接到waitFor()
。 - 实现要求:
-
此方法的默认实现调用
destroy()
,因此可能不会强制终止该进程。 - Implementation Note:
- 强烈建议使用此类的具体实现来使用兼容的实现来覆盖此方法。
- 结果
-
Process
对象表示强制销毁的进程 - 从以下版本开始:
- 1.8
-
supportsNormalTermination
public boolean supportsNormalTermination()
返回true
如果执行destroy()
是正常终止进程,则返回false
如果执行destroy
强行并立即终止进程。调用此方法
Process
通过返回的对象ProcessBuilder.start()
和Runtime.exec(java.lang.String)
回报true
或false
取决于平台的实现。- 实现要求:
-
此实现抛出
UnsupportedOperationException
的实例,并且不执行任何其他操作。 - 结果
-
true
如果执行destroy()
是为了正常终止该过程; 否则,destroy()
强行终止该过程 - 异常
-
UnsupportedOperationException
- 如果Process实现不支持此操作 - 从以下版本开始:
- 9
-
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()) { ... }
isAlive()
。 - 实现要求:
-
此实现在一个单独的线程中重复执行
waitFor()
,直到它成功返回。 如果waitFor
的执行被中断,则保留线程的中断状态。当
waitFor()
成功返回时,无论进程的退出状态如何,CompletableFuture都是completed 。 如果同时等待大量进程,则此实现可能会为线程堆栈消耗大量内存。外部实现应该重写此方法并提供更有效的实现。 例如,要委托给基础流程,它可以执行以下操作:
public CompletableFuture<Process> onExit() { return delegate.onExit().thenApply(p -> this); }
- 结果
-
一个新的
CompletableFuture<Process>
为过程 - 从以下版本开始:
- 9
-
toHandle
public ProcessHandle toHandle()
返回Process的ProcessHandle。 由ProcessBuilder.start()
和Runtime.exec(java.lang.String)
返回的Process
对象实现toHandle
,相当于ProcessHandle.of(pid)
,包括检查SecurityManager和RuntimePermission("manageProcess")
。- 实现要求:
-
此实现抛出
UnsupportedOperationException
的实例, 不执行任何其他操作。 子类应重写此方法以为进程提供ProcessHandle。 该方法pid()
,info()
,children()
,并descendants()
,除非被覆盖,操作上ProcessHandle。 - 结果
- 返回Process的ProcessHandle
- 异常
-
UnsupportedOperationException
- 如果Process实现不支持此操作 -
SecurityException
- 如果已安装安全管理器并且它拒绝RuntimePermission(“manageProcess”) - 从以下版本开始:
- 9
-
info
public ProcessHandle.Info info()
返回有关该进程的信息的快照。ProcessHandle.Info
实例具有访问器方法,如果可用,则返回有关该进程的信息。- 实现要求:
-
此实现将有关进程的信息返回:
toHandle().info()
。 - 结果
- 有关进程的信息快照,始终为非null
- 异常
-
UnsupportedOperationException
- 如果Process实现不支持此操作 - 从以下版本开始:
- 9
-
children
public Stream<ProcessHandle> children()
- 实现要求:
-
此实现将直接子
节点返回为:
toHandle().children()
。 - 结果
- ProcessHandles的顺序Stream,用于进程的直接子进程
- 异常
-
UnsupportedOperationException
- 如果Process实现不支持此操作 -
SecurityException
- 如果已安装安全管理器并且它拒绝RuntimePermission(“manageProcess”) - 从以下版本开始:
- 9
-
descendants
public Stream<ProcessHandle> descendants()
- 实现要求:
-
此实现将所有子项返回为:
toHandle().descendants()
。 - 结果
- ProcessHandles的顺序Stream,用于进程后代的进程
- 异常
-
UnsupportedOperationException
- 如果Process实现不支持此操作 -
SecurityException
- 如果安装了安全管理器并且它拒绝RuntimePermission(“manageProcess”) - 从以下版本开始:
- 9
-
-