注:本文基于JDK1.8
Process是一个抽象类 , 封装了一个进程(即一个执行程序)。
创建进程两种方式
方式1
Process p = Runtime.getRuntime().exec(cmd);
方式2
Process p = new ProcessBuilder(cmd).start();
其中:
cmd 是命令行,是一个字符串或者是字符串数组。
arthas
常用方法
public abstract class Process {
/**
* 连接到子进程的输出流
* @return
*/
public abstract OutputStream getOutputStream();
/**
* 连接到子进程的输入流
* @return
*/
public abstract InputStream getInputStream();
/**
* 连接到子进程的错误流
* @return
*/
public abstract InputStream getErrorStream();
/**
* 使当前线程在必要时等待,直到此Process对象表示的进程已终止
* 如果子进程已经中止,此方法立即返回
* 如果子进程还没有中止,正在调用的线程将被阻塞,直到子进程退出。
* @return
* @throws InterruptedException
*/
public abstract int waitFor() throws InterruptedException;
/**
* 使当前线程等待,直到子进程退出或者超时
* @param timeout
* @param unit
* @return
* @throws InterruptedException
*/
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;
}
/**
* 返回子进程退出的值
* @return
*/
public abstract int exitValue();
/**
* 杀死子进程,子进程是否立即终止取决于实现
*/
public abstract void destroy();
/**
* 强制杀死子进程
* @return
*/
public java.lang.Process destroyForcibly() {
destroy();
return this;
}
/**
* 判断子进程是否存活
* @return
*/
public boolean isAlive() {
try {
exitValue();
return false;
} catch(IllegalThreadStateException e) {
return true;
}
}