前言
java process API 开始于1.5 ,但是功能不够,没有被大众熟知。如今很多语言,都能很好的对进程做控制,所以java9 这次的更新算是做出了一些更新,以下是总结的几点,并非全部,而是认为比较关键的几个方面。
创建进程并且终止
new ProcessBuilderder 创建了一个命令,让系统休息5s, 第一个参数是cmd,第二个参数是cmd的参数。onExit()返回一个future,通过get()方法,让其阻塞等到进程执行完再推出。
public static void processBuilder() {
ProcessBuilder builder = new ProcessBuilder("/bin/sleep", "5");
try {
Process process = builder.start();
System.out.println("pid:" + process.pid());//获取进程id
System.out.println(process.isAlive());
try {
process.onExit().get();//终止进程
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(process.isAlive());
// process.isAlive();
} catch (IOException e) {
e.printStackTrace();
}
}
获取当前java进程信息
ProcessHandle 是1.9 推出的。里面包含很多对进程的信息获取和处理方法,这是此次更新的核心类。
public static void givenCurrentProcessInfo() {
ProcessHandle processHandle = ProcessHandle.current();
ProcessHandle.Info processInfo = processHandle.info();
System.out.println(processHandle.pid());
//获取参数信息
for (String s : processInfo.arguments().get()) {
System.out.println("argument:"+ s);
}
}
获取所有进程信息
allProcess 获取当前系统运行的所有进程信息
public static void getAllProcess() {
Stream<ProcessHandle> liveProcesses = ProcessHandle.allProcesses();
liveProcesses.forEach(x->{
if (x.isAlive()) {
System.out.println("pid" + x.pid());
x.info();//可以获取到更细致的内容
}
});
}
获取创建的子进程信息
通过ProcessBuilder 创建了一个进程,该进程是在当前java进程产生的,所以自然是当前的子进程。然后通过current().childeren()获取子进程。
有两种获取子进程方法
- 获取直接的子进程 用children()
- 获取所有的子进程递归的descendants()
public static void getChildProcess() {
ProcessBuilder processBuilder = new ProcessBuilder("java", "-version");
try {
processBuilder.start();//创建子进程
Stream<ProcessHandle> children
= ProcessHandle.current().children();
children.forEach(x->{
System.out.println("cmd:" + x.info().command().get()+ " argument:" + x.info().arguments().get()[0]);
});
} catch (IOException e) {
e.printStackTrace();
}
}