Ein ProcessHandle ist ein neuer Typ in Java 9, der native Prozesse identifiziert. Wir bekommen Exemplare entweder über
- die Process-Objektmethode toHandle(),
- die statische Methodecurrent(),
- allProcesses(), die alle Prozesse über einen Stream<ProcessHandle> liefert,
- die statische ProcessHandle-Methode of(long pid), die uns das ProcessHandle in ein Optional verpackt,
- mit einem vorhandenen ProcessHandle können wir weiterhin mit children() und descendants() einen Stream<ProcessHandle> erfragen und mit parent() auf die Eltern zugreifen.
Jeder Prozess verfügt über eine identifizierende long-Ganzahl, die getPid() auf dem ProcessHandle liefert. Weitere Details zu den Startparametern offenbare ProcessHandle.Info-Ojekte.
Beispiel: Gib alle vorhanden Informationen über alle Prozesse aus:
Consumer<ProcessHandle> log = handle -> System.out.printf( "PID=%s, Root?=%s, Info=%s%n", handle.getPid(), !handle.parent().isPresent(), handle.info() ); ProcessHandle.allProcesses().forEach( log );
Die Ausgabe kann so aussehen:
PID=0, Root?=true, Info=[] PID=4, Root?=true, Info=[] ... PID=4368, Root?=true, Info=[] PID=4568, Root?=true, Info=[user: Optional[Yoga\Christian], cmd: C:\Windows\System32\sihost.exe, startTime: Optional[2017-02-04T20:54:07.601Z], totalTime: Optional[PT3M39.703125S]] PID=4592, Root?=true, Info=[user: Optional[Yoga\Christian], cmd: C:\Windows\System32\svchost.exe, startTime: Optional[2017-02-04T20:54:07.621Z], totalTime: Optional[PT14.9375S]] PID=4628, Root?=true, Info=[] ...
ProcessHandle implementiert vernünftig equals(…) und auch Comparable<ProcessHandle>; die Sortierung ist nach der Prozess-ID.
Methoden-Delegation
Einige Methoden aus Process delegieren an den assoziierten ProcessHandle. Die Methoden heißen gleich.
Process-Methoden | Implementierung |
long getPid() | return toHandle().getPid(); |
ProcessHandle.Info info() | return toHandle().info(); |
Stream<ProcessHandle> children() | return toHandle().children(); |
Stream<ProcessHandle> descendants() | return toHandle().descendants(); |
Weiterhin gibt es onExit(), supportsNormalTermination(), isAlive(), destroy() und destroyForcibly() auf beiden Typen Process und ProcessHandle.
Über Objekte vom Typ ProcessHandle.Info lassen sich weitere Details zum Prozess erfragen; die Rückgaben sind Optional, weil die Informationen vielleicht nicht vorliegen.
- static interface java.lang.Info
- Optional<String[]> arguments()
Programmargumente beim Start. - Optional<String> command()
Ausführbarer Pfadname vom Prozess. - Optional<String> commandLine()
Konkatenation von command() und arguments() beste Repräsentation des Programmaufrufs. - Optional<Instant> startInstant()
Startzeit des Prozesses. - Optional<Duration> totalCpuDuration()
Bisher verbrauchte CPU-Zeit. - Optional<String> user()
Benutzer dieses Prozesses.