ProcessHandle interface นำมารวมใน Java 9 อนุญาตให้ดำเนินการและตรวจสอบสถานะของ process ที่เกี่ยวข้อง interface นี้ให้ process's native process ID (pid) start time accumulated CPU time arguments command user parent process และ descendants
การดำเนินการที่ ProcessHandle รองรับ
- คืน ProcessHandle.Info ข้อมูลเพิ่มเติมของ process
- PID ของ process
- ตรวจสอบว่า alive หรือไม่
- ดึง snapshot ของ direct children ของ process
- ดึง snapshot ของ all descendants ของ process
- ดึง snapshot ของ process ที่กำลังรันทั้งหมด
- ทำลาย process (destroy)
- คืน CompletableFuture พร้อม ProcessHandle เมื่อ process จบ
ProcessHandle.Info - ข้อมูลจาก snapshot
- Command ของ process
- Arguments ของ process
- Command-line ของ process
- Start time ของ process
- CPU time ที่ process ใช้
- User ของ process
ตัวอย่าง: PID และ isAlive
import java.util.Optional;
public class ProcessHandleTest {
public static void main(String args[]) {
long pid = ProcessHandle.current().pid();
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("PID: " + currentProcess.pid());
Optional<ProcessHandle> processHandle = ProcessHandle.of(pid);
boolean isAlive = processHandle.isPresent() && processHandle.get().isAlive();
System.out.println(isAlive);
}
}
ผลลัพธ์
PID: 6484
true
ProcessHandle.of() และ allProcesses()
// หา process จาก PID
Optional<ProcessHandle> ph = ProcessHandle.of(1234);
// Stream ของ process ทั้งหมด
Stream<ProcessHandle> all = ProcessHandle.allProcesses();
all.filter(p -> p.info().user().orElse("").equals("myuser"))
.forEach(p -> System.out.println(p.pid() + " " + p.info().command().orElse("")));
ProcessHandle API ทำให้จัดการ process ระบบปฏิบัติการได้จาก Java โดยไม่ต้องใช้ JNI หรือ external commands