Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のProcess APIによるコアライブラリの変更点とは?

Java 9では、ProcessHandleインターフェースを使うことで、ネイティブ呼び出し経由でプロセスのPID(プロセスID)を簡単に取得できるようになりました。これにより、現在実行中のJavaプロセス(JVM)に関する情報へのアクセスが大幅に改善されています。

ProcessHandleには、その内部クラスであるInfoクラスが用意されており、実行ファイル名、ユーザー名、開始時刻など、プロセスに関する詳細情報を取得できます。さらに、allProcesses()メソッドを使えば、システム上で現在動作しているすべてのプロセスのスナップショットをストリームとして取得することも可能です。

サンプルコード

import java.lang.ProcessHandle.Info;

public class ProcessAPIChanges {
    public void detailedAPIInfo(ProcessHandle processHandle) {
        Info processInfo = processHandle.info();
        System.out.println("プロセスの詳細情報:");
        System.out.println("[実行ファイル名] " + processInfo.command().get());
        System.out.println("[ユーザー名] " + processInfo.user().get());
        System.out.println("[開始時刻] " + processInfo.startInstant().get().toString());
    }
    public static void main(String args[]) {
        System.out.println("Process API の変更点(コアライブラリ)");
        ProcessAPIChanges processAPIChanges = new ProcessAPIChanges();
        ProcessHandle processHandle = ProcessHandle.current();

        System.out.println("[現在のプロセスID] " + processHandle.pid());

        processAPIChanges.detailedAPIInfo(processHandle);
        ProcessHandle.allProcesses()
            .filter(ph -> ph.info().command().isPresent())
            .limit(4).forEach((process) -> processAPIChanges.detailedAPIInfo(process));
    }
}

実行結果

Process API の変更点(コアライブラリ)
[現在のプロセスID] 5724
プロセスの詳細情報:
[実行ファイル名] C:\Program Files\Java\jdk-9.0.4\bin\java.exe
[ユーザー名] Tutorialspoint\User
[開始時刻] 2020-04-01T07:35:43.152Z
プロセスの詳細情報:
[実行ファイル名] C:\WINDOWS\System32\taskhostex.exe
[ユーザー名] Tutorialspoint\User
[開始時刻] 2020-04-01T04:14:36.241Z
プロセスの詳細情報:
[実行ファイル名] C:\Program Files\Synaptics\SynTP\SynTPEnh.exe
[ユーザー名] Tutorialspoint\User
[開始時刻] 2020-04-01T04:14:36.257Z
プロセスの詳細情報:
[実行ファイル名] C:\WINDOWS\explorer.exe
[ユーザー名] Tutorialspoint\User
[開始時刻] 2020-04-01T04:14:36.335Z
プロセスの詳細情報:
[実行ファイル名] C:\Program Files (x86)\Dell Wireless\Bluetooth Suite\BtvStack.exe
[ユーザー名] Tutorialspoint\User
[開始時刻] 2020-04-01T04:14:51.594Z

コードのポイント

このサンプルコードでは、以下の重要なメソッドが使用されています。

  • ProcessHandle.current():現在実行中のJVMプロセスのハンドルを取得します。
  • pid():プロセスのPIDをlong型の値として返します。
  • info():プロセスの詳細情報を含むInfoインスタンスを返します。各フィールドはOptional型のため、get()isPresent()で安全に扱えます。
  • allProcesses():システム上の全プロセスのストリームを返し、Stream APIのfilter()limit()と組み合わせて柔軟に処理できます。

このように、Java 9のProcess APIは従来のProcessクラスでは困難だったOSレベルのプロセス管理を、モダンなStream APIと組み合わせて直感的かつ安全に行えるよう進化しました。

  1. Java 9の主要な新機能と拡張機能を徹底解説

    Java 9の主な新機能と拡張機能とは?Oracleは、豊富な新機能と数多くの拡張機能を備えたJava 9をリリースしました。本記事では、Java 9で導入された重要な機能や改善点をわかりやすく解説します。1. コレクション用ファクトリメソッドファクトリメソッドは、変更不可能(イミュータブル)なコレクションのインスタンスを作成できる特殊な静的メソッドです。これらのメソッドを利用することで、List、Set、Mapを簡潔な記述で生成できます。2. Java Platform Module System(JPMS)Javaモジュールは、JavaアプリケーションやJavaパッケージをひとつのモジュー

  2. JavaのProcessクラスとは?目的と主なメソッドを実例付きで解説

    概要java.lang.Processクラスは、Objectクラスのサブクラスであり、Runtimeクラスのexec()メソッドによって起動された外部プロセスを表現するためのクラスです。Processオブジェクトを通じて、起動したプロセスの制御や情報の取得を行うことができます。なお、Processクラスは抽象クラスとして定義されているため、直接インスタンス化することはできません。インスタンスは、Runtime.exec()などのメソッドの戻り値として取得します。主なメソッドdestroy(): プロセスを強制終了させるexitValue(): プロセスの終了コードを返すgetErrorStre