Java 9 改善されたプロセス API

Java 9 新特性Java 9 新機能

Java 9 より前では、Process API はローカルプロセスを使用するための基本的なサポートが依然として不足していました。例えば、プロセスの PID や所有者、プロセスの開始時刻、プロセスがどれだけの CPU 時間を使用したか、いくつのローカルプロセスが実行されているかなどを取得することができませんでした。

Java 9 は Process API に ProcessHandle という名前のインターフェースを追加して、java.lang.Process クラスを強化しました。

ProcessHandle インターフェースのインスタンスはローカルプロセスを識別し、プロセスの状態を照会し、プロセスを管理することを可能にします。

ProcessHandle は入れ子になったインターフェース Info を提供し、開発者がローカルプロセスの PID を取得するためにしばしばネイティブコードを使用しなければならないという苦境から解放します。

インターフェース内でメソッドの実装を提供することはできません。抽象メソッドと非抽象メソッド(メソッドと実装)の組み合わせを提供したい場合は、抽象クラスを使用する必要があります。

ProcessHandle インターフェースで宣言された onExit() メソッドは、プロセスが終了したときに特定の操作をトリガーするために使用できます。

例

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.info(); System.out.printf("Process ID : %s%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)); } }

上記の例を実行した出力結果は次のとおりです。

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 9 新特性Java 9 新機能

その他の拡張