一.概述
Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。
//创建一个抽象类(进程)
public abstract class Process {}
//声明一个变量(进程等待)
public abstract int waitFor() throws InterruptedException;
//创建Boolean类型的方法(等待)
//long timeout 时间 TimeUnit unit 单位
//抛出中断异常(当阻塞方法收到中断请求会抛出)
public boolean waitFor(long timeout, TimeUnit unit)
throws InterruptedException
{
//获取系统时间
long startTime = System.nanoTime();
//单位
long rem = unit.toNanos(timeout);
do {
try {
//调用exitValue方法
exitValue();
return true;
} catch(IllegalThreadStateException ex) {
//如果时间>0,线程进行睡眠
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;
}
public abstract int exitValue(); //声明抽象方法
public abstract void destroy();
//创建销毁进程方法
public Process destroyForcibly() {
destroy();
return this;
}
//判断当前的线程是否处于活动状态
public boolean isAlive() {
try {
exitValue();
return false;
//线程启动抛出异常
} catch(IllegalThreadStateException e) {
return true;
}
}
Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。
ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。
创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。
它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。
因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。
当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。