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

クラスProcess


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

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

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

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

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

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

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

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

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

      • Process

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

      • getOutputStream

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

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

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

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

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

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

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

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

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

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

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

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

        戻り値:
        プロセスのエラー出力に接続された入力ストリーム
      • 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()からの CompletableFutureは、プロセスが終了したときに完了します。

      • destroyForcibly

        public Process destroyForcibly()
        強制的にプロセスを強制終了します。 このProcessオブジェクトで表されるプロセスは強制的に終了されます。 強制的なプロセス破棄は、プロセスの即時終了として定義されますが、通常の終了では、プロセスを正常に停止できます。 プロセスが動作していない場合、アクションは実行されません。

        onExit()からの CompletableFutureは、プロセスが終了したときに完了します。

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

        APIのノート:
        プロセスは即時に終了できません。つまり、destroyForcibly()がコールされた後、isAlive()が短期間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のインスタンスがスローされ、他のアクションは実行されません。
        戻り値:
        destroy()の実装が通常プロセスを終了する場合はtrue。それ以外の場合は、destroy()によってプロセスが強制的に終了されます。
        例外:
        UnsupportedOperationException - プロセス実装がこの操作をサポートしない場合
        導入されたバージョン:
        9
      • isAlive

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

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

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

        onExit().get()をコールすると、プロセスが終了するまで待機し、プロセスが戻されます。 将来は、プロセスが完了しているかどうかを確認したり、プロセスが終了する待機したりするために使用できます。 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は完了されます。 多数のプロセスが同時に待機される場合、この実装はスレッド・スタックに大量のメモリーを消費する可能性があります。

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

        
            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オブジェクトは、SecurityManagerおよびRuntimePermission("manageProcess")のチェックを含め、ProcessHandle.of(pid)と同等のtoHandleを実装します。
        実装要件:
        この実装では、UnsupportedOperationExceptionのインスタンスがスローされ、他のアクションは実行されません。 サブクラスは、このメソッドをオーバーライドして、プロセスにProcessHandleを提供する必要があります。 pid()info()children()およびdescendants()の各メソッドは、オーバーライドされないかぎり、ProcessHandleに対して動作します。
        戻り値:
        プロセスのProcessHandleを返します
        例外:
        UnsupportedOperationException - プロセス実装がこの操作をサポートしない場合
        SecurityException - セキュリティ・マネージャがインストールされ、RuntimePermission("manageProcess")が拒否された場合
        導入されたバージョン:
        9
      • info

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

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

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

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

        プロセスは非同期に作成および終了します。 プロセスがアライブである保証はありません。

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

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

        プロセスは非同期に作成および終了します。 プロセスがアライブである保証はありません。

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