Process
java.lang.Object
|—java.lang.Process
public abstract class Process
extends Object
ProcessBuilder#start() 和 Runtime#exec(String[],String[],File) 方法创建本机进程并返回 Process 子类的实例,该实例可用于控制进程并获取有关它的信息。 Process 类提供了执行来自进程的输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀死)进程的方法。
创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程、守护进程、Microsoft Windows 上的 Win16/DOS 进程或 shell 脚本。
默认情况下,创建的子进程没有自己的终端或控制台。它的所有标准 I/O(即 stdin、stdout、stderr)操作都将被重定向到父进程,在那里可以通过使用 getOutputStream()、getInputStream() 和 getErrorStream() 方法获得的流来访问它们。父进程使用这些流向子进程提供输入并从子进程获取输出。由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。
如果需要,也可以使用 ProcessBuilder 类的方法重定向子进程 I/O。
当没有更多对 Process 对象的引用时,子进程不会被终止,而是子进程继续异步执行。
不要求由 Process 对象表示的进程相对于拥有该 Process 对象的 Java 进程异步或并发执行。
从 1.5 开始,ProcessBuilder#start() 是创建流程的首选方式。
构造函数摘要
构造函数 | 描述 |
---|---|
Process() |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
abstract void | destroy() | 杀死子进程。 |
Process | destroyForcibly() | 杀死子进程。 |
abstract int | exitValue() | 返回子进程的退出值。 |
abstract InputStream | getErrorStream() | 返回连接到子进程错误输出的输入流。 |
abstract InputStream | getInputStream() | 返回连接到子进程正常输出的输入流。 |
abstract OutputStream | getOutputStream() | 返回连接到子进程正常输入的输出流。 |
boolean | isAlive() | 测试这个 Process 所代表的子进程是否存活。 |
abstract int | waitFor() | 如有必要,使当前线程等待,直到此 Process 对象表示的进程终止。 |
boolean | waitFor(long timeout, TimeUnit unit) | 如有必要,使当前线程等待,直到此 Process 对象表示的子进程终止,或指定的等待时间过去。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造函数详细信息
Process
public Process()
方法详情
getOutputStream
public abstract OutputStream getOutputStream()
返回连接到子进程正常输入的输出流。 流的输出通过管道传输到此 Process 对象表示的进程的标准输入中。
如果子流程的标准输入已使用 ProcessBuilder#redirectInput(Redirect) 重定向,则此方法将返回空输出流。
实施说明:对返回的输出流进行缓冲是个好主意。
返回:
连接到子进程正常输入的输出流
getInputStream
public abstract InputStream getInputStream()
返回连接到子进程正常输出的输入流。 流从由该 Process 对象表示的进程的标准输出中获取通过管道传输的数据。
如果子流程的标准输出已使用 ProcessBuilder#redirectOutput(Redirect) 重定向,则此方法将返回空输入流。
否则,如果子进程的标准错误已经使用 ProcessBuilder#redirectErrorStream(boolean) 重定向,则该方法返回的输入流将接收合并后的标准输出和子进程的标准错误。
实现说明:对返回的输入流进行缓冲是个好主意。
返回:
连接到子进程正常输出的输入流
getErrorStream
public abstract InputStream getErrorStream()
返回连接到子进程错误输出的输入流。 流从这个 Process 对象表示的进程的错误输出中获取数据。
如果子进程的标准错误已使用 ProcessBuilder#redirectError(Redirect) 或 ProcessBuilder#redirectErrorStream(boolean) 重定向,则此方法将返回 null 输入流。
实现说明:对返回的输入流进行缓冲是个好主意。
返回:
连接到子进程错误输出的输入流
waitFor
public abstract int waitFor() throws InterruptedException
如有必要,使当前线程等待,直到此 Process 对象表示的进程终止。 如果子进程已经终止,则此方法立即返回。 如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。
返回:
此 Process 对象表示的子进程的退出值。 按照惯例,值为 0 表示正常终止。
Throws:
Throw名称 | Throw描述 |
---|---|
InterruptedException | 如果当前线程在等待时被另一个线程 Thread#interrupt(),则等待结束并抛出 InterruptedException。 |
waitFor
public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException
如有必要,使当前线程等待,直到此 Process 对象表示的子进程终止,或指定的等待时间过去。
如果子进程已经终止,则此方法立即返回值为 true。 如果进程尚未终止并且超时值小于或等于零,则此方法立即返回值 false。
此方法的默认实现会轮询 exitValue 以检查进程是否已终止。 强烈鼓励此类的具体实现以更有效的实现覆盖此方法。
参数:
参数名称 | 参数描述 |
---|---|
timeout | 最长等待时间 |
unit | timeout 参数的时间单位 |
返回:
如果子进程已退出,则为 true;如果在子进程退出之前经过了等待时间,则为 false。
Throws:
Throw名称 | Throw描述 |
---|---|
InterruptedException | 如果当前线程在等待时被中断。 |
NullPointerException | 如果单位为空 |
exitValue
public abstract int exitValue()
返回子进程的退出值。
返回:
此 Process 对象表示的子进程的退出值。 按照惯例,值 0 表示正常终止。
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalThreadStateException | 如果此 Process 对象表示的子进程尚未终止 |
destroy
public abstract void destroy()
杀死子进程。 此 Process 对象表示的子进程是否被强制终止取决于实现。
destroyForcibly
public Process destroyForcibly()
杀死子进程。 此 Process 对象所代表的子进程被强制终止。
此方法的默认实现调用destroy(),因此可能不会强制终止进程。 强烈鼓励此类的具体实现使用兼容的实现覆盖此方法。 在 ProcessBuilder#start 和 Runtime#exec 返回的 Process 对象上调用此方法将强制终止进程。
注意:子进程可能不会立即终止。 即 isAlive() 可能会在 destroyForcibly() 被调用后的短时间内返回 true。 如果需要,此方法可以链接到 waitFor()。
返回:
表示要强制销毁的子进程的 Process 对象。
isAlive
public boolean isAlive()
测试这个 Process 所代表的子进程是否存活。
返回:
如果此 Process 对象表示的子进程尚未终止,则为 true。