Java 9 进程 API 改进:ProcessHandle 与异步控制
核心改进
Java 9 大幅增强 java.lang.ProcessHandle,提供进程原生信息查询与控制能力,无需 JNI 或解析 ps 命令输出。
ProcessHandle 关键能力
- 基础信息:PID、启动时间、累计 CPU 时间、命令行、参数、用户、父进程、子进程/后代。
- 生命周期控制:
destroy()(正常终止)、destroyForcibly()(强制杀死)、supportsNormalTermination()。 - 存活检查:
isAlive()。 - 异步回调:
onExit()返回CompletableFuture,进程退出时触发。 - 流式查询:
ProcessHandle.allProcesses()返回所有可见进程流,支持过滤、映射、收集。
代码示例
import java.time.ZoneId;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.io.IOException;
public class Tester {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
String np = "Not Present";
Process p = pb.start();
ProcessHandle.Info info = p.toHandle().info();
System.out.printf("Process ID : %d%n", p.pid());
System.out.printf("Command name : %s%n", info.command().orElse(np));
System.out.printf("Command line : %s%n", info.commandLine().orElse(np));
System.out.printf("Start time: %s%n",
info.startInstant()
.map(i -> i.atZone(ZoneId.systemDefault()).toLocalDateTime().toString())
.orElse(np));
System.out.printf("Arguments : %s%n",
info.arguments().map(a -> Stream.of(a).collect(Collectors.joining(" "))).orElse(np));
System.out.printf("User : %s%n", info.user().orElse(np));
// 异步等待退出
p.onExit().thenAccept(ph ->
System.out.println("Process exited with PID: " + ph.pid()));
}
}
输出示例
Process ID : 5800
Command name : C:\Windows\System32\notepad.exe
Command line : Not Present
Start time: 2017-11-04T21:35:03.626
Arguments : Not Present
User: administrator
进阶:列出所有 Java 进程
ProcessHandle.allProcesses()
.filter(ph -> ph.info().command().orElse("").contains("java"))
.forEach(ph -> System.out.printf("PID: %d, CMD: %s%n",
ph.pid(), ph.info().commandLine().orElse("")));
对比优势
| 场景 | Java 8 及之前 | Java 9+ |
|---|---|---|
| 获取当前进程 PID | JNI/解析 ManagementFactory 名称 | ProcessHandle.current().pid() |
| 获取子进程树 | 外部命令解析 | ph.children() / ph.descendants() |
| 异步等待进程结束 | 轮询 waitFor() 阻塞线程 | ph.onExit().thenAccept(...) |
| 跨平台统一 API | 无 | 全平台一致 |
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- Java 9 (JDK 9) 核心特性与优势全览
- Java 9 进程 API 改进:ProcessHandle 与异步控制
- Java 9 Stream API 增强:takeWhile、dropWhile、iterate 与 ofNullable