前言
月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂)
央是一片海洋,海乃百川,代表着一块海绵(吸纳万物)
泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出)
月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容
希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄!
一.Process的作用:
直接看源码注释(我的翻译可能不太准,如果道友们有更棒的理解,可以留言或者私信)
/**
* The {@link ProcessBuilder#start()} and
* {@link Runtime#exec(String[],String[],File) Runtime.exec}
* methods create a native process and return an instance of a
* subclass of {@code Process} that can be used to control the process
* and obtain information about it. The class {@code Process}
* provides methods for performing input from the process, performing
* output to the process, waiting for the process to complete,
* checking the exit status of the process, and destroying (killing)
* the process.
* 1. ProcessBuilder.start()和 Runtime.exec(String[],String[],File)
* 方法创建本机进程并返回可以使用的Process子类的实例控制过程并获取有关它的信息。
* Process类提供了执行进程输入、执行输出到进程、等待进程完成、检查进程退出状态以及销毁(杀死)进程的方法
* <p>The methods that create processes may not work well for special
* processes on certain native platforms, such as native windowing
* processes, daemon processes, Win16/DOS processes on Microsoft
* Windows, or shell scripts.
* 2.创建进程的方法可能不适用于某些原生平台上的特殊进程,
* 例如原生窗口进程、守护进程、Microsoft Windows 上的 Win16DOS 进程或 shell 脚本。
* <p>By default, the created subprocess does not have its own terminal
* or console. All its standard I/O (i.e. stdin, stdout, stderr)
* operations will be redirected to the parent process, where they can
* be accessed via the streams obtained using the methods
* {@link #getOutputStream()},
* {@link #getInputStream()}, and
* {@link #getErrorStream()}.
* The parent process uses these streams to feed input to and get output
* from the subprocess. Because some native platforms only provide
* limited buffer size for standard input and output streams, failure
* to promptly write the input stream or read the output stream of
* the subprocess may cause the subprocess to block, or even deadlock.
* 3.默认情况下,创建的子进程没有自己的终端或控制台。
* 它的所有标准 IO(即 stdin、stdout、stderr)操作都将被重定向到父进程,
* 在那里可以通过使用 getOutputStream()、getInputStream()和 getErrorStream()。
* 父进程使用这些流向子进程提供输入和从子进程获取输出。由于一些原生平台只为标准输入输出流提供有限的缓冲区大小,
* 如果不能及时写入输入流或读取子进程的输出流,可能会导致子进程阻塞,甚至死锁
* <p>Where desired, <a href="ProcessBuilder.html#redirect-input">
* subprocess I/O can also be redirected</a>
* using methods of the {@link ProcessBuilder} class.
* 4.如果需要,子进程 IO 也可以使用ProcessBuilder类的方法重定向
* <p>The subprocess is not killed when there are no more references to
* the {@code Process} object, but rather the subprocess
* continues executing asynchronously.
* 5.当没有更多对 Process对象的引用时,子进程不会被终止,而是子进程继续异步执行。
* <p>There is no requirement that a process represented by a {@code
* Process} object execute asynchronously or concurrently with respect
* to the Java process that owns the {@code Process} object.
* 6.不要求由Process对象表示的进程与拥有Process对象的 Java 进程异步或并发执行
* <p>As of 1.5, {@link ProcessBuilder#start()} is the preferred way
* to create a {@code Process}.
*7.从 1.5 开始,ProcessBuilder.start()是创建 Process的首选方式
* @since JDK1.0
*/
二.内部方法:
getOutputStream()
/**
* 1.返回连接到子进程的正常输入的输出流。流的输出通过管道传输到此 Process对象表示的进程的标准输入中
* 2.如果子流程的标准输入已使用 ProcessBuilder.redirectInput(Redirect)重定向,
* 则此方法将返回空输出流。
* 3.实现说明:将返回的输出流缓冲是一个好主意。
*/
public abstract OutputStream getOutputStream();
getInputStream
/**
* 1.返回连接到子进程正常输出的输入流。该流从由该Process对象表示的进程的标准输出中获取管道数据。
* 2.如果子流程的标准输出已使用ProcessBuilder.redirectOutput(Redirect)重定向,
* 则此方法将返回 空输入流。
* 3否则,如果子进程的标准错误已经使用 ProcessBuilder.redirectErrorStream(boolean) 重定向,
* 则此方法返回的输入流将接收合并的标准输出和子进程的标准错误。
* 4.实现说明:对返回的输入流进行缓冲是个好主意
*/
public abstract InputStream getInputStream();
getErrorStream
/**
* 1.返回连接到子进程错误输出的输入流。该流从该 Process对象表示的进程的错误输出中获取管道数据。
* 2.如果子流程的标准错误已使用ProcessBuilder.redirectError(Redirect)
* 3.实现说明:对返回的输入流进行缓冲是个好主意
*/
public abstract InputStream getErrorStream();
waitFor
/**
* 1.如有必要,使当前线程等待,直到此Process对象表示的进程终止。如果子进程已经终止,
* 则此方法立即返回。如果子进程尚未终止,调用线程将被阻塞,直到子进程退出
*/
public abstract int waitFor() throws InterruptedException;
/**
* 1.使当前线程在必要时等待,直到此Process对象表示的子进程终止,或指定的等待时间过去
* 2.如果子进程已经终止,则此方法立即返回值true。如果进程尚未终止且超时值小于或等于零,则此方法立即返回值false
* 3.此方法的默认实现轮询 exitValue以检查进程是否已终止。强烈鼓励此类的具体实现以更有效的实现覆盖此方法。
*/
public boolean waitFor(long timeout, TimeUnit unit)
throws InterruptedException
{
long startTime = System.nanoTime();
long rem = unit.toNanos(timeout);
do {
try {
exitValue();
return true;
} catch(IllegalThreadStateException ex) {
if (rem > 0)
Thread.sleep(
Math.min(TimeUnit.NANOSECONDS.toMillis(rem) + 1, 100));
}
rem = unit.toNanos(timeout) - (System.nanoTime() - startTime);
} while (rem > 0);
return false;
}
exitValue
/**
* 返回子进程的退出值
*/
public abstract int exitValue();
destroy
/**
* 杀死子进程。此Process对象表示的子进程是否被强制终止取决于实现。
*/
public abstract void destroy();
/**
* 1.杀死子进程。这个 Process对象所代表的子进程被强行终止
* 2.此方法的默认实现调用destroy,因此可能不会强制终止进程。强烈鼓励此类的具体实现使用兼容实现覆盖此方法。
* 在 ProcessBuilder.start和 Runtime.exec返回的Process对象上调用此方法将强制终止进程。
* 3.注意:子进程可能不会立即终止。即isAlive()可能会在调用destroyForcibly()后的短时间内返回 true。
* 如果需要,此方法可以链接到 waitFor()。
*/
public Process destroyForcibly() {
destroy();
return this;
}
isAlive
/**
* 测试此 Process表示的子进程是否处于活动状态
*/
public boolean isAlive() {
try {
exitValue();
return false;
} catch(IllegalThreadStateException e) {
return true;
}
}
三.总结
大家知道什么是进程,线程,纤程吗....