クラスProcess

java.lang.Object
java.lang.Process
すべての実装されたインタフェース:
Closeable, AutoCloseable

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

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

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

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

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

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

Processのサブクラスでは、オーバーライドされた各メソッドがスーパークラス・メソッドを呼び出すようにする必要があります。 たとえば、closeがオーバーライドされた場合、サブクラスはProcess.close()が呼び出されるようにする必要があります。

public class LoggingProcess extends java.lang.Process {
    ...
    @Override
    public void close() throws IOException  {
        try {
            super.close();
        } catch (IOException ex) {
            LOGGER.log(ex);
         } finally {
            LOGGER.log("process closed");
        }
    }
    ...
}

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

リソース使用率

プロセスの起動では、起動プロセスと起動プロセス、およびそれらの間の通信ストリームの両方のリソースが使用されます。 プロセスおよびプロセス間の通信を制御するリソースは、プロセスまたは入力、エラーおよび出力ストリームまたはリーダーへの参照がなくなるか、またはそれらがクローズされるまで保持されます。 Process closeメソッドは、すべてのストリームをクローズし、リソースを解放するプロセスを終了します。 try-with-resourcesブロックを使用すると、try-with-resourcesブロックが終了したときにプロセスが終了するようになります。

Processオブジェクトへの参照がなくなると、プロセスは強制終了されませんが、プロセスは非同期的に実行し続けます。 プロセス実装は、オペレーティング・システム・リソースの漏洩を防ぐために参照されなくなったストリームのファイル記述子およびハンドルをクローズします。 終了または終了したプロセスが監視され、そのリソースが解放されます。

ストリームは、オペレーティング・システム・リソースの解放が遅延しないように、不要になったときにクローズする必要があります。 Try-with-resourcesを使用して、ストリームをオープンおよびクローズできます。

たとえば、ある出力を生成し、終了することがわかっているプログラムの出力を取得するには:

List<String> capture(List<String> args) throws Exception {
    ProcessBuilder pb = new ProcessBuilder(args);
    try (Process process = pb.start();
         BufferedReader in = process.inputReader()) {
        List<String> captured = in.readAllLines();
        int status = process.waitFor();
        if (status != 0) {
            throw new RuntimeException("Process %d: %s failed with %d"
                        .formatted(process.pid(), args, status));
        }
        return captured;
    }
}

ストリーム・リソース(ファイル記述子またはハンドル)は、常にペアになります。1つは起動プロセス内、もう1つは起動プロセス内の接続の他方の端です。 いずれかの端でストリームをクローズすると、通信は終了しますが、他のプロセスには直接的な影響はありません。 通常、ストリームをクローズすると、他のプロセスが終了します。

プロセスの破棄は、プロセスを終了するようにオペレーティング・システムに指示します。 そのプロセスのリソースをクリーンアップして解放するのはオペレーティング・システムです。 通常、ファイル記述子とハンドルは閉じられます。 それらが閉じられると、ほかのプロセスへの接続はすべて終了し、呼び出し元のプロセスシグナル内のファイル記述子とハンドルはファイルの終わりまたは閉じられます。 通常、これはファイルの終わりまたは例外とみなされます。

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

    コンストラクタ
    コンストラクタ
    説明
    Processのデフォルト・コンストラクタです。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    プロセスの直接の子のスナップショットを返します。
    void
    すべてのリーダーおよびライター・ストリームを閉じ、プロセスが終了するまで待機します。
    プロセスの子孫のスナップショットを返します。
    abstract void
    プロセスを強制終了します。
    プロセスを強制的に停止します。
    プロセスの標準エラーに接続されたBufferedReaderを返します。
    Charsetを使用してこのプロセスの標準エラーに接続されたBufferedReaderを返します。
    abstract int
    プロセスの終了値を返します。
    abstract InputStream
    プロセスのエラー出力に接続された入力ストリームを返します。
    abstract InputStream
    プロセスの通常の出力に接続された入力ストリームを返します。
    abstract OutputStream
    プロセスの通常入力に接続された出力ストリームを返します。
    プロセスに関する情報のスナップショットを返します。
    プロセスの標準出力に接続されたBufferedReaderを返します。
    Charsetを使用してこのプロセスの標準出力に接続されたBufferedReaderを返します。
    boolean
    このProcessによって表されるプロセスが動作しているかどうかをテストします。
    プロセスの終了のCompletableFuture<Process>を返します。
    ネイティブ・エンコーディングを使用して、プロセスの通常入力に接続されたBufferedWriterを返します。
    Charsetを使用してプロセスの通常入力に接続されたBufferedWriterを返します。
    long
    pid()
    プロセスのネイティブ・プロセスIDを返します。
    boolean
    destroy()の実装が通常プロセスを終了する場合はtrueを戻し、destroyの実装を強制的に戻してプロセスをすぐに終了する場合はfalseを戻します。
    プロセスのProcessHandleを返します。
    abstract int
    必要な場合に、このProcessオブジェクトが表すプロセスが終了するまで現在のスレッドを待機させます。
    boolean
    waitFor(long timeout, TimeUnit unit)
    このProcessオブジェクトによって表されるプロセスが終了するか、指定された待機時間が経過するまで、必要に応じて現在のスレッドを待機させます。
    boolean
    waitFor(Duration duration)
    このProcessオブジェクトで表されるプロセスが終了するか、指定された待機時間が経過するまで、現在のスレッドは必要に応じて待機します。

    クラスオブジェクトで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    修飾子と型
    メソッド
    説明
    protected Object
    このオブジェクトのコピーを作成して、返します。
    boolean
    このオブジェクトと他のオブジェクトが等しいかどうかを示します。
    protected void
    削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。
    最終決定は非推奨であり、将来のリリースで削除される可能性があります。
    final Class<?>
    このObjectの実行時クラスを返します。
    int
    このオブジェクトに対するハッシュ・コード値を返します。
    final void
    このオブジェクトのモニターで待機中のスレッドを1つ再開します。
    final void
    このオブジェクトのモニターで待機中のすべてのスレッドを再開します。
    オブジェクトの文字列表現を返します。
    final void
    現在のスレッドが目覚めるまで待機します。通常、notifiedまたはinterruptedです。
    final void
    wait(long timeoutMillis)
    現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。
    final void
    wait(long timeoutMillis, int nanos)
    現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。
  • コンストラクタの詳細

    • Process

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

    • close

      public void close() throws IOException
      すべてのリーダーおよびライター・ストリームを閉じ、プロセスが終了するまで待機します。 このProcessがすでにクローズされていて、このメソッドを起動しても効果がない場合、このメソッドはべき等です。

      プロセス入力またはエラー・ストリームからのデータが必要な場合は、このメソッドをコールする前にデータを読み取る必要があります。 ストリームの最後まで読み取られなかったストリームの内容は失われ、破棄されるか無視されます。

      プロセス終了値が対象の場合、呼出し側はこのメソッドをコールする前に、プロセスの終了を待機する必要があります。

      不要になったストリームはクローズする必要があります。 すでに閉じたストリームを閉じると、通常は効果はありませんが、ストリームに固有です。 ストリームのクローズ時にIOExceptionが発生すると、プロセスの終了後にスローされます。 ストリームを閉じてスローされた例外(ある場合)は、最初のIOException抑制された例外として追加されます。

      ストリームが閉じられると、このメソッドはプロセスの終了を待機します。 プロセスの待機中に中断され、プロセスが強制的に破棄され、このメソッドはプロセスが終了するまで待機し続けます。 中断されたステータスは、このメソッドが戻されるか、IOExceptionsがスローされる前に再アサートされます。

      定義:
      close、インタフェースAutoCloseable
      定義:
      close、インタフェースCloseable
      APIのノート:
      try-with-resourcesの例では、プロセスへのテキストの書込み、レスポンスの読取り、およびストリームとプロセスのクローズを行います。
      void main() {
          try (Process p = new ProcessBuilder("cat").start();
               var writer = p.outputWriter();
               var reader = p.inputReader()) {
              writer.write(haiku);
              writer.close();
              // Read all lines and print each
              reader.readAllLines()
                      .forEach(IO::println);
              var status = p.waitFor();
              if (status != 0)
                  throw new RuntimeException("unexpected process status: " + status);
          } catch (Exception e) {
              System.out.println("Process failed: " + e);
          }
      }
      
      static final String haiku = """
                  Oh, the sunrise glow;
                  Paddling with the river flow;
                  Chilling still, go slow.
                  """;
      
      実装要件:
      このメソッドは、プロセスI/Oストリームをクローズしてから、プロセスが終了する待機します。 waitFor()中断されると、プロセスは強制的に破棄され、close()はプロセスの終了を待機します。
      実装上のノート:
      このクラスをオーバーライドする具体的な実装では、このメソッドをオーバーライドし、スーパークラスのcloseメソッドを呼び出すことを強くお薦めします。
      スロー:
      IOException - いずれかのストリームを閉じると例外がスローされる
      導入されたバージョン:
      26
    • getOutputStream

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

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

      出力ストリームが不要になった場合は、閉じるようにしてください。

      APIのノート:
      getOutputStream()outputWriter()またはoutputWriter(Charset)の両方に書き込む場合、OutputStreamに書込みする前にBufferedWriter.flushをコールする必要があります。
      実装上のノート:
      実装にあたってのノート: 返される出力ストリームのバッファ処理をお薦めします。
      戻り値:
      プロセスの通常の入力に接続された出力ストリーム
    • getInputStream

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

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

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

      入力ストリームが不要になった場合は、クローズする必要があります。

      APIのノート:
      このメソッドまたは入力リーダーのいずれかを使用しますが、同じProcessで両方を使用することはできません。 入力リーダーは、入力ストリームからバイトを消費およびバッファします。 入力ストリームから読み取られたバイトはリーダーによって認識されず、バッファの内容は予測できません。
      実装上のノート:
      実装にあたってのノート: 返される入力ストリームのバッファ処理をお薦めします。
      戻り値:
      プロセスの通常の出力に接続された入力ストリーム
    • getErrorStream

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

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

      エラー・ストリームが不要になった場合は、クローズする必要があります。

      APIのノート:
      このメソッドまたはエラー・リーダーのいずれかを使用しますが、同じProcessで両方を使用することはできません。 エラー・リーダーは、エラー・ストリームからバイトを消費し、バッファします。 エラー・ストリームから読み取られたバイトはリーダーには表示されず、バッファの内容は予測できません。
      実装上のノート:
      実装にあたってのノート: 返される入力ストリームのバッファ処理をお薦めします。
      戻り値:
      プロセスのエラー出力に接続された入力ストリーム
    • inputReader

      public final BufferedReader inputReader()
      プロセスの標準出力に接続されたBufferedReaderを返します。 ネイティブ・エンコーディングのCharsetは、標準出力からの文字、行またはストリーム行の読取りに使用されます。

      このメソッドは、native.encodingシステム・プロパティで指定されたCharsetを使用してinputReader(Charset)に委任します。 native.encodingが有効な文字セット名でない場合、またはサポートされていない場合は、Charset.defaultCharset()が使用されます。

      リーダーが不要になった場合は、閉じるようにしてください。

      APIのノート:
      このメソッドまたは入力ストリームのいずれかを使用しますが、同じProcessで両方を使用することはできません。 入力リーダーは、入力ストリームからバイトを消費およびバッファします。 入力ストリームから読み取られたバイトはリーダーによって表示されず、バッファの内容は予測できません。
      戻り値:
      native.encodingを使用する場合はBufferedReader、サポートされていない場合はCharset.defaultCharset()
      導入されたバージョン:
      17
    • inputReader

      public final BufferedReader inputReader(Charset charset)
      Charsetを使用してこのプロセスの標準出力に接続されたBufferedReaderを返します。 BufferedReaderは、標準出力の文字、行またはストリーム行の読取りに使用できます。

      文字は、このプロセスgetInputStream()からバイトを読み取ってデコードするInputStreamReaderによって読み取られます。 バイトはcharsetを使用して文字にデコードされ、不正な形式の入力文字およびマップ不能文字のシーケンスは文字セットのデフォルト置換に置き換えられます。 BufferedReaderは、InputStreamReaderから文字を読み込んでバッファします。

      このメソッドへの最初のコールによって、同じcharsetで再度コールされた場合、同じBufferedReaderが返されます。 このメソッドを別のcharsetで再度コールするとエラーになります。

      プロセスの標準出力がProcessBuilder.redirectOutputを使用してリダイレクトされた場合、InputStreamReader「ヌル入力ストリーム」から読み取られます。

      リーダーが不要になった場合は、閉じるようにしてください。

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

      APIのノート:
      このメソッドまたは入力ストリームのいずれかを使用しますが、同じProcessで両方を使用することはできません。 入力リーダーは、入力ストリームからバイトを消費およびバッファします。 入力ストリームから読み取られたバイトはリーダーによって表示されず、バッファの内容は予測できません。

      プロセスが終了し、標準入力がリダイレクトされていない場合、基礎となるストリームから使用可能なバイトの読取りはベスト・エフォート・ベースであり、予測不能になる可能性があります。

      パラメータ:
      charset - バイトを文字にデコードするために使用されるCharset
      戻り値:
      charsetを使用したプロセスの標準出力の場合はBufferedReader
      スロー:
      NullPointerException - charsetnullの場合
      IllegalStateException - 異なる文字セット引数を使用して複数回コールした場合
      導入されたバージョン:
      17
    • errorReader

      public final BufferedReader errorReader()
      プロセスの標準エラーに接続されたBufferedReaderを返します。 ネイティブ・エンコーディングのCharsetは、標準エラーからの文字、行またはストリーム行の読取りに使用されます。

      このメソッドは、native.encodingシステム・プロパティで指定されたCharsetを使用してerrorReader(Charset)に委任します。 native.encodingが有効な文字セット名でない場合、またはサポートされていない場合は、Charset.defaultCharset()が使用されます。

      不要になった場合は、エラーリーダーを閉じるようにしてください。

      APIのノート:
      このメソッドまたはエラー・ストリームのいずれかを使用しますが、同じProcessで両方を使用することはできません。 エラー・リーダーは、エラー・ストリームからバイトを消費し、バッファします。 エラー・ストリームから読み取られたバイトはリーダーには表示されず、バッファの内容は予測できません。
      戻り値:
      native.encodingを使用する場合はBufferedReader、サポートされていない場合はCharset.defaultCharset()
      導入されたバージョン:
      17
    • errorReader

      public final BufferedReader errorReader(Charset charset)
      Charsetを使用してこのプロセスの標準エラーに接続されたBufferedReaderを返します。 BufferedReaderを使用すると、標準エラーの文字、行またはストリーム行を読み取ることができます。

      文字は、このプロセスgetErrorStream()からバイトを読み取ってデコードするInputStreamReaderによって読み取られます。 バイトはcharsetを使用して文字にデコードされ、不正な形式の入力文字およびマップ不能文字のシーケンスは文字セットのデフォルト置換に置き換えられます。 BufferedReaderは、InputStreamReaderから文字を読み込んでバッファします。

      このメソッドへの最初のコールによって、同じcharsetで再度コールされた場合、同じBufferedReaderが返されます。 このメソッドを別のcharsetで再度コールするとエラーになります。

      プロセスの標準エラーがProcessBuilder.redirectErrorまたはProcessBuilder.redirectErrorStreamを使用してリダイレクトされた場合、InputStreamReader「ヌル入力ストリーム」から読み取られます。

      不要になった場合は、エラーリーダーを閉じるようにしてください。

      APIのノート:
      このメソッドまたはエラー・ストリームのいずれかを使用しますが、同じProcessで両方を使用することはできません。 エラー・リーダーは、エラー・ストリームからバイトを消費し、バッファします。 エラー・ストリームから読み取られたバイトはリーダーには表示されず、バッファの内容は予測できません。

      プロセスが終了し、標準エラーがリダイレクトされない場合は、基礎となるストリームから使用可能なバイトの読取りがベスト・エフォート・ベースで予測できない可能性があります。

      パラメータ:
      charset - バイトを文字にデコードするために使用されるCharset
      戻り値:
      charsetを使用したプロセスの標準エラーの場合はBufferedReader
      スロー:
      NullPointerException - charsetnullの場合
      IllegalStateException - 異なる文字セット引数を使用して複数回コールした場合
      導入されたバージョン:
      17
    • outputWriter

      public final BufferedWriter outputWriter()
      ネイティブ・エンコーディングを使用して、プロセスの通常入力に接続されたBufferedWriterを返します。 文字出力ストリームにテキストを書き込み、単一文字、配列、および文字列を効率的に書き込むために文字をバッファリングします。

      このメソッドは、native.encodingシステム・プロパティで指定されたCharsetを使用してoutputWriter(Charset)に委任します。 native.encodingが有効な文字セット名でない場合、またはサポートされていない場合は、Charset.defaultCharset()が使用されます。

      出力ライターが不要になった場合は、閉じるようにしてください。

      戻り値:
      native.encodingシステム・プロパティの文字セットを使用したプロセスの標準入力に対するBufferedWriter
      導入されたバージョン:
      17
    • outputWriter

      public final BufferedWriter outputWriter(Charset charset)
      Charsetを使用してプロセスの通常入力に接続されたBufferedWriterを返します。 文字出力ストリームにテキストを書き込み、単一文字、配列、および文字列を効率的に書き込むために文字をバッファリングします。

      ライターによって書き込まれる文字はOutputStreamWriterを使用してバイトにエンコードされ、CharsetはこのProcessによって表されるプロセスの標準入力に書き込まれます。 誤った形式の入力およびマップ不能文字シーケンスは、文字セットのデフォルト置換で置き換えられます。

      このメソッドへの最初のコールによって、同じcharsetで再度コールされた場合、同じBufferedWriterが返されます。 このメソッドを別のcharsetで再度コールするとエラーになります。

      プロセスの標準入力がProcessBuilder.redirectInputを使用してリダイレクトされた場合、OutputStreamWriter「ヌル出力ストリーム」に書き込みます。

      出力ライターが不要になった場合は、閉じるようにしてください。

      APIのノート:
      BufferedWriterは、文字、文字の配列および文字列を書き込みます。 BufferedWriterPrintWriterでラップすると、プリミティブやオブジェクトの効率的なバッファリングおよび書式設定、および行末の自動フラッシュがサポートされます。 BufferedWriter.flush()メソッドをコールして、バッファ出力をプロセスにフラッシュします。

      getOutputStream()outputWriter()またはoutputWriter(Charset)の両方に書き込む場合、OutputStreamに書込みする前にBufferedWriter.flushをコールする必要があります。

      パラメータ:
      charset - 文字をバイトにエンコードするCharset
      戻り値:
      charsetを使用したプロセスの標準入力に対するBufferedWriter
      スロー:
      NullPointerException - charsetnullの場合
      IllegalStateException - 異なる文字セット引数を使用して複数回コールした場合
      導入されたバージョン:
      17
    • 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
    • waitFor

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

      プロセスがすでに終了している場合、このメソッドは値trueを返します。 プロセスが終了しておらず、期間が正でない場合、このメソッドは値falseで即時に戻されます。

      実装要件:
      このメソッドのデフォルト実装は、exitValueをポーリングして、プロセスが終了したかどうかを確認します。
      実装上のノート:
      このクラスの具象実装では、このメソッドをより効率的な実装でオーバーライドすることを強くお薦めします。
      パラメータ:
      duration - 待機する最大期間。正でない場合、このメソッドは即時に戻されます。
      戻り値:
      プロセスが終了した場合はtrue、プロセスが終了するまでの待機期間が経過した場合はfalse
      スロー:
      InterruptedException - 待機中に現在のスレッドで割込みが発生した場合。
      NullPointerException - 期間がnullの場合
      導入されたバージョン:
      24
    • 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(String)によって返されたProcessオブジェクトに対して起動すると、プロセスが強制的に終了します。

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

      public boolean supportsNormalTermination()
      destroy()の実装が通常プロセスを終了する場合はtrueを戻し、destroyの実装を強制的に戻してプロセスをすぐに終了する場合はfalseを戻します。

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

      実装要件:
      この実装は、UnsupportedOperationExceptionのインスタンスをスローし、他のアクションは実行しません。
      戻り値:
      destroy()の実装で通常プロセスを終了する場合はtrue、そうでない場合は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()をコールすると、プロセスが終了するのを待機し、プロセスを返します。 将来は、プロセスが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(String)によって返されるProcessオブジェクトは、toHandleProcessHandle.of(pid)と同等のものとして実装します。
      実装要件:
      この実装は、UnsupportedOperationExceptionのインスタンスをスローし、他のアクションは実行しません。 サブクラスは、このメソッドをオーバーライドして、プロセスにProcessHandleを指定する必要があります。 オーバーライドされないかぎり、メソッドpid()info()children()およびdescendants()は、ProcessHandleに対して動作します。
      戻り値:
      プロセスのProcessHandleを返す
      スロー:
      UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
      導入されたバージョン:
      9
    • info

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

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

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

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

      プロセスが作成され、非同期で終了するNote。 プロセスがaliveである保証はありません。

      実装要件:
      この実装は、直接の子を次のように返します: toHandle().children()
      戻り値:
      プロセスの直接の子プロセスであるプロセスの一連のProcessHandle
      スロー:
      UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
      導入されたバージョン:
      9
    • descendants

      public Stream<ProcessHandle> descendants()
      プロセスの子孫のスナップショットを返します。 プロセスの子孫は、プロセスの子とそれらの子の子孫です。 通常、「生きていない」のプロセスは子を持ちません。

      プロセスが作成され、非同期で終了するNote。 プロセスがaliveである保証はありません。

      実装要件:
      この実装は、すべての子を: toHandle().descendants()
      戻り値:
      プロセスの子孫であるプロセスのProcessHandlesの連続ストリーム
      スロー:
      UnsupportedOperationException - Process実装がこの操作をサポートしていない場合
      導入されたバージョン:
      9