モジュール java.base
パッケージ java.lang

クラスProcess


  • public abstract class Process
    extends Object
    Processは、ProcessBuilder.startおよびRuntime.execによって開始されたネイティブ・プロセスの制御を提供します。 このクラスは、プロセスからの入力の実行、プロセスへの出力の実行、プロセスの完了を待つプロセスの終了ステータスのチェック、プロセスの破棄(kill)を行うメソッドを提供します。 ProcessBuilder.start()メソッドやRuntime.execメソッドはネイティブのプロセスを作成し、Processのサブクラスのインスタンスを返しますが、これを使えば、そのプロセスを制御したり情報を取得したりできます。

    たとえば、ネイティブなウィンドウ処理プロセス、デーモン・プロセス、Microsoft Windows環境でのWin16/DOSプロセス、あるいはシェル・スクリプトといったプロセスです。

    デフォルトでは、作成されたプロセスには独自の端末またはコンソールがありません。 その標準入出力(つまり標準入力、標準出力、標準エラー)の処理はすべて親プロセスにリダイレクトされますが、それらの情報にアクセスするには、メソッドgetOutputStream()getInputStream()、およびgetErrorStream()を使って取得されるストリームを使用します。 親プロセスは、これらのストリームを使用して、プロセスへの入力とプロセスへの出力を行います。 一部のネイティブ・プラットフォームでは、標準の入力ストリームと出力ストリームに対して限られたバッファ・サイズしか提供されないため、入力ストリームを速やかに書き込んでいないか、プロセスの出力ストリームを読み取っていないと、プロセスがブロックされたり、デッドロックにさえなったりします。

    必要に応じて、ProcessBuilderクラスのメソッドを使用してprocess I/Oをリダイレクトすることもできます。

    Processオブジェクトへの参照がなくなってもプロセスは強制終了されませんが、プロセスは非同期的に実行され続けます。

    Processオブジェクトによって表されるプロセスが、Processオブジェクトを所有するJavaプロセスに対して非同期にまたは同時に実行する必要はありません。

    1.5以降でProcessを作成するための推奨の方法は、ProcessBuilder.start()です。

    Processのサブクラスは、「プロセスID」「プロセスに関する情報」「直接の子プロセスたち」、および「直接の子プロセスたちとその子プロセスたちの子孫」を含む完全に機能するProcessを提供するために、onExit()およびtoHandle()メソッドをオーバーライドする必要があります。 基本となるProcessまたはProcessHandleへの委譲は、通常、最も簡単で効率的です。

    導入されたバージョン:
    1.0
    • コンストラクタのサマリー

      コンストラクタ 
      コンストラクタ 説明
      Process()
      Processのデフォルトのコンストラクタです。
    • コンストラクタの詳細

      • Process

        public Process()
        Processのデフォルトのコンストラクタです。
    • メソッドの詳細

      • getOutputStream

        public abstract OutputStream getOutputStream()
        プロセスの通常の入力に接続された出力ストリームを返します。 ストリームへの出力は、このProcessオブジェクトが表すプロセスの標準入力に渡されます。

        プロセスの標準入力がProcessBuilder.redirectInputを使用してリダイレクトされた場合、このメソッドは「ヌル出力ストリーム」を返します。

        実装にあたっての注意: 返される出力ストリームのバッファ処理をお薦めします。

        戻り値:
        プロセスの通常の入力に接続された出力ストリーム
      • getInputStream

        public abstract InputStream getInputStream()
        プロセスの通常の出力に接続された入力ストリームを返します。 ストリームは、このProcessオブジェクトが表すプロセスの標準出力から渡されたデータを取得します。

        プロセスの標準出力がProcessBuilder.redirectOutputを使用してリダイレクトされた場合、このメソッドは「ヌル入力ストリーム」を返します。

        そうでない場合、ProcessBuilder.redirectErrorStreamを使用してプロセスの標準エラーがリダイレクトされた場合、このメソッドによって返された入力ストリームは、マージされた標準出力とプロセスの標準エラーを受け取ります。

        実装にあたっての注意: 返される入力ストリームのバッファ処理をお薦めします。

        戻り値:
        プロセスの通常の出力に接続された入力ストリーム
      • getErrorStream

        public abstract InputStream getErrorStream()
        プロセスのエラー出力に接続された入力ストリームを返します。 ストリームは、このProcessオブジェクトが表すプロセスのエラー出力から渡されたデータを取得します。

        ProcessBuilder.redirectErrorまたはProcessBuilder.redirectErrorStreamを使用してプロセスの標準エラーがリダイレクトされた場合、このメソッドは「ヌル入力ストリーム」を返します。

        実装にあたっての注意: 返される入力ストリームのバッファ処理をお薦めします。

        戻り値:
        プロセスのエラー出力に接続された入力ストリーム
      • waitFor

        public abstract int waitFor()
                             throws InterruptedException
        必要な場合に、このProcessオブジェクトが表すプロセスが終了するまで現在のスレッドを待機させます。 このメソッドは、プロセスがすでに終了している場合にただちに戻ります。 プロセスがまだ終了していない場合、プロセスが終了するまで、呼び出しスレッドはブロックされます。
        戻り値:
        このProcessオブジェクトによって表されるプロセスの終了値。 0は正常終了を示す。
        例外:
        InterruptedException - 現在のスレッドが待機中にほかのスレッドによって割り込まれた場合、待機を終了してInterruptedExceptionがスローされる。
      • waitFor

        public boolean waitFor​(long timeout,
                               TimeUnit unit)
                        throws InterruptedException
        このProcessオブジェクトが表すプロセスが終了するか、指定された待機時間が経過するまで、必要に応じて現在のスレッドを待機させます。

        プロセスがすでに終了している場合、このメソッドは値trueを返します。 プロセスがまだ終了しておらず、タイムアウト値がゼロ以下の場合、このメソッドは値falseでただちに復帰します。

        このメソッドのデフォルト実装では、exitValueをポーリングしてプロセスが終了しているかどうかを確認します。 このクラスの具象実装では、このメソッドをより効率的な実装でオーバーライドすることを強くお薦めします。

        パラメータ:
        timeout - 待機する最長時間
        unit - timeout引数の時間単位
        戻り値:
        プロセスが終了した場合はtrue、プロセスが終了するまでに待機時間が経過した場合はfalse
        例外:
        InterruptedException - 待機中に現在のスレッドで割込みが発生した場合。
        NullPointerException - 単位がnullの場合
        導入されたバージョン:
        1.8
      • exitValue

        public abstract int exitValue()
        プロセスの終了値を返します。
        戻り値:
        このProcessオブジェクトによって表されるプロセスの終了値。 0は正常終了を示す。
        例外:
        IllegalThreadStateException - このProcessオブジェクトによって表されるプロセスがまだ終了していない場合
      • destroy

        public abstract void destroy()
        プロセスを終了します。 このProcessオブジェクトによって表されるプロセスが「正常終了」であるかどうかは、実装に依存します。 強制的なプロセス破壊は、プロセスの即時終了として定義されますが、正常終了は、プロセスが正常に終了することを可能にします。 プロセスが生存していない場合、何も実行されません。

        プロセスが終了すると、onExit()からのCompletableFuturecompletedになります。

      • destroyForcibly

        public Process destroyForcibly()
        プロセスを強制的に強制終了します。 このProcessオブジェクトによって表されるプロセスは、強制終了されます。 強制的なプロセス破壊は、プロセスの即時終了として定義されますが、正常終了は、プロセスが正常に終了することを可能にします。 プロセスが生存していない場合、何も実行されません。

        プロセスが終了すると、onExit()からのCompletableFuturecompletedになります。

        ProcessBuilder.start()およびRuntime.exec(java.lang.String)によって返されたProcessオブジェクトでこのメソッドを呼び出すと、強制的にプロセスを終了します。

        APIの注:
        プロセスはすぐに終了しないことがあります。つまり、isAlive()は、destroyForcibly()が呼び出された後、短期間trueを返すことがあります。 このメソッドは、必要に応じてwaitFor()にチェーンされることがあります。
        実装要件:
        このメソッドのデフォルト実装では、destroy()を呼び出すため、プロセスが強制終了されない場合があります。
        実装上の注意:
        このクラスの具象実装では、このメソッドを準拠した実装でオーバーライドすることを強くお薦めします。
        戻り値:
        強制破壊されたプロセスを表すProcessオブジェクト
        導入されたバージョン:
        1.8
      • supportsNormalTermination

        public boolean supportsNormalTermination()
        destroy()の実装が正常にプロセスを終了する場合trueを返します。destroyの実装が強制的かつ即座にプロセスを終了する場合は、falseを返します。

        ProcessBuilder.start()およびRuntime.exec(java.lang.String)によって返されたProcessオブジェクトでこのメソッドを呼び出すと、プラットフォームの実装に応じてtrueまたはfalseが返されます。

        実装要件:
        この実装はUnsupportedOperationExceptionのインスタンスをスローし、他のアクションを実行しません。
        戻り値:
        true destroy()の実装が正常にプロセスを終了する場合。そうでなければ、destroy()はプロセスを強制終了
        例外:
        UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
        導入されたバージョン:
        9
      • isAlive

        public boolean isAlive()
        このProcessが表すプロセスが生存しているかどうかをテストします。
        戻り値:
        このProcessオブジェクトによって表されるプロセスがまだ終了していない場合は、true
        導入されたバージョン:
        1.8
      • pid

        public long pid()
        プロセスのネイティブ・プロセスIDを返します。 ネイティブ・プロセスIDは、オペレーティング・システムがプロセスに割り当てる識別番号です。
        実装要件:
        このメソッドの実装は、プロセスIDをtoHandle().pid()として返します。
        戻り値:
        プロセスのネイティブ・プロセスID
        例外:
        UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
        導入されたバージョン:
        9
      • onExit

        public CompletableFuture<Process> onExit()
        プロセス終了のためのCompletableFuture<Process>を返します。 CompletableFutureは、プロセスの終了時に同期または非同期に実行される可能性のある従属機能またはアクションをトリガーする機能を提供します。 プロセスが終了すると、CompletableFutureはプロセスの終了ステータスに関係なくcompletedになります。

        onExit().get()を呼び出すと、プロセスが終了してプロセスが返されるのを待ちます。 Futureは、プロセスが終了するかどうかを確認するために、プロセスがdonewaitかどうかを確認するために使用できます。 CompletableFutureの取消しはプロセスに影響を与えません。

        ProcessBuilder.start()から戻されたプロセスは、プロセスの終了を待つための効率的なメカニズムを提供するために、デフォルトの実装をオーバーライドします。

        APIの注:
        onExitを使用するとwaitForの代わりに、追加の並行性とプロセス結果への便利なアクセスが可能になります。 ラムダ式を使用して、プロセス実行の結果を評価することができます。 値が使用される前に他の処理が行われる場合、onExitは現在のスレッドを解放し、値が必要な場合にのみブロックするのに便利なメカニズムです。
        たとえば、2つのファイルを比較するプロセスを起動し、それらが同じ場合はブール値を取得します:
           Process p = new ProcessBuilder("cmp", "f1", "f2").start();
            Future<Boolean> identical = p.onExit().thenApply(p1 -> p1.exitValue() == 0);
            ...
            if (identical.get()) { ... }
         
        プロセスは、ComputableFutureが完了し、従属アクションが呼び出される前にisAlive()で終了したことが観察されることがあります。
        実装要件:
        この実装は、正常に戻るまで別のスレッドでwaitFor()を繰り返し実行します。 waitForの実行が中断された場合、スレッドの割り込みステータスは保持されます。

        waitFor()が正常に戻ると、CompletableFutureはプロセスの終了ステータスに関係なくcompletedになります。 多数のプロセスが並行して待機している場合、この実装はスレッド・スタックのために多くのメモリーを消費する可能性があります。

        外部実装はこのメソッドをオーバーライドし、より効率的な実装を提供する必要があります。 たとえば、基になるプロセスに委任するには、次のようにします:

        
            public CompletableFuture<Process> onExit() {
               return delegate.onExit().thenApply(p -> this);
            }
         

        戻り値:
        プロセス用の新しいCompletableFuture<Process>
        導入されたバージョン:
        9
      • toHandle

        public ProcessHandle toHandle()
        プロセスのProcessHandleを返します。 ProcessBuilder.start()Runtime.exec(java.lang.String)によって返されるProcessオブジェクトのtoHandleは、SecurityManagerとRuntimePermission("manageProcess")のチェックを含むProcessHandle.of(pid)の同等物として実装されます。
        実装要件:
        この実装はUnsupportedOperationExceptionのインスタンスをスローし、他のアクションを実行しません。 サブクラスは、このメソッドをオーバーライドして、プロセスのProcessHandleを提供する必要があります。 メソッドpid()info()children()、およびdescendants()は、オーバーライドされない限り、ProcessHandleで処理されます。
        戻り値:
        プロセスのProcessHandleを返す
        例外:
        UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
        SecurityException - セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合
        導入されたバージョン:
        9
      • info

        public ProcessHandle.Info info()
        プロセスに関する情報のスナップショットを返します。

        ProcessHandle.Infoインスタンスには、利用可能なプロセスに関する情報を返すアクセサ・メソッドがあります。

        実装要件:
        この実装は、プロセスに関する情報をtoHandle().info()として返します。
        戻り値:
        プロセスに関する情報のスナップショット。常にnullではありません。
        例外:
        UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
        導入されたバージョン:
        9
      • children

        public Stream<ProcessHandle> children()
        プロセスの直接の子のスナップショットを返します。 直接の子プロセスの親プロセスです。 通常、生存していないプロセスには子がありません。

        プロセスは非同期で作成され、終了することに注意してください。 プロセスが生存している保証はありません。

        実装要件:
        この実装は、直接の子たちを次のように返します: toHandle().children()
        戻り値:
        プロセスの直接の子プロセスであるプロセスの一連のProcessHandle
        例外:
        UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
        SecurityException - セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合
        導入されたバージョン:
        9
      • descendants

        public Stream<ProcessHandle> descendants()
        プロセスの子孫のスナップショットを返します。 プロセスの子孫は、再帰的にプロセスの子と子の子孫です。 通常、生存していないプロセスには子がありません。

        プロセスは非同期で作成され、終了することに注意してください。 プロセスが生存している保証はありません。

        実装要件:
        この実装は、すべての子を次のように返します: toHandle().descendants()
        戻り値:
        プロセスの子孫であるプロセスのProcessHandlesの連続ストリーム
        例外:
        UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
        SecurityException - セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合
        導入されたバージョン:
        9