- java.lang.Object
-
- java.lang.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 id , information about the process , direct children和direct children plus descendants of those children的过程。 委托基础Process或ProcessHandle通常是最简单和最有效的。- 从以下版本开始:
- 1.0
-
-
构造方法摘要
构造方法 Constructor 描述 Process()
Process的默认构造函数。
-
方法摘要
所有方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 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()
返回进程的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
- 如果单位为空 - 从以下版本开始:
- 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()
被调用后的destroyForcibly()
返回true。 如果需要,该方法可以链接到waitFor()
。 - 实现要求:
-
此方法的默认实现将调用
destroy()
,因此可能不会强制终止进程。 - Implementation Note:
- 强烈建议使用此类的具体实现来使用兼容实现覆盖此方法。
- 结果
-
代表进程强制销毁的
Process
对象 - 从以下版本开始:
- 1.8
-
supportsNormalTermination
public boolean supportsNormalTermination()
返回true
如果执行destroy()
是正常终止进程,返回false
如果执行destroy
强制立即终止进程。根据
ProcessBuilder.start()
和Runtime.exec(java.lang.String)
返回的Process
对象调用此方法返回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()
。 - 结果
- 进程的本机进程标识
- 异常
-
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表达式可用于评估流程执行的结果。 如果在使用该值之前要进行其他处理,则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()
返回进程的ProcessHandle。Process
通过返回的对象ProcessBuilder.start()
和Runtime.exec(java.lang.String)
实施toHandle
为相当于ProcessHandle.of(pid)
包括在检查了SecurityManager和RuntimePermission("manageProcess")
。- 实现要求:
-
此实现引发了一个
UnsupportedOperationException
的实例,并且不执行其他操作。 子类应该覆盖此方法以为该进程提供一个ProcessHandle。 该方法pid()
,info()
,children()
,并descendants()
,除非被覆盖,操作上ProcessHandle。 - 结果
- 返回进程的ProcessHandle
- 异常
-
UnsupportedOperationException
- 如果Process实现不支持此操作 -
SecurityException
- 如果已安装安全管理器,并拒绝RuntimePermission(“manageProcess”) - 从以下版本开始:
- 9
-
info
public ProcessHandle.Info info()
返回有关进程信息的快照。一个
ProcessHandle.Info
实例具有访问器方法,返回有关进程的信息(如果可用)。- 实现要求:
-
此实现返回有关进程的信息:
toHandle().info()
。 - 结果
- 关于进程的信息的快照,始终为非空
- 异常
-
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作为进程的后代
- 异常
-
UnsupportedOperationException
- 如果Process实现不支持此操作 -
SecurityException
- 如果安全管理器已经安装,并且它拒绝RuntimePermission(“manageProcess”) - 从以下版本开始:
- 9
-
-