---
title: 'ProcessHandle und Prozess-IDs'
url: 'https://www.tutego.de/blog/javainsel/2017/02/processhandle-und-prozess-ids'
markdown: 'https://www.tutego.de/blog/javainsel/2017/02/processhandle-und-prozess-ids.md'
date: '2017-02-25'
description: '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…'
taxonomy:
  category:
    - Allgemein
    - Insel
    - 'Java 9'
---

# ProcessHandle und Prozess-IDs

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://www.tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://www.tutego.de/blog/javainsel/)

## ProcessHandle und Prozess-IDs

25.02.2017 · [Christian Ullenboom](https://www.tutego.de/blog/javainsel/author/admin/)

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:

```java
Consumer 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:

```text
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-MethodenImplementierunglong `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.

```java
- 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.

Kategorien: [Allgemein](https://www.tutego.de/blog/javainsel/category/allgemein/), [Insel](https://www.tutego.de/blog/javainsel/category/insel/), [Java 9](https://www.tutego.de/blog/javainsel/category/java-9/)

[← Alle Beiträge](https://www.tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Prozess-Status erfragen und das Ende einleiten](https://www.tutego.de/blog/javainsel/2017/02/prozess-status-erfragen-und-das-ende-einleiten.md)
- Next: [StackWalker and Stack-Walking API](https://www.tutego.de/blog/javainsel/2017/02/stackwalker-and-stack-walking-api.md)
