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
-
コンストラクタのサマリー
-
メソッドのサマリー
修飾子と型メソッド説明children()
プロセスの直接の子のスナップショットを返します。プロセスの子孫のスナップショットを返します。abstract void
destroy()
プロセスを終了します。プロセスを強制的に強制終了します。abstract int
プロセスの終了値を返します。abstract InputStream
プロセスのエラー出力に接続された入力ストリームを返します。abstract InputStream
プロセスの通常の出力に接続された入力ストリームを返します。abstract OutputStream
プロセスの通常の入力に接続された出力ストリームを返します。info()
プロセスに関する情報のスナップショットを返します。boolean
isAlive()
このProcess
が表すプロセスが生存しているかどうかをテストします。onExit()
プロセス終了のためのCompletableFuture<Process>
を返します。long
pid()
プロセスのネイティブ・プロセスIDを返します。boolean
destroy()
の実装が正常にプロセスを終了する場合true
を返します。destroy
の実装が強制的かつ即座にプロセスを終了する場合は、false
を返します。toHandle()
プロセスのProcessHandleを返します。abstract int
waitFor()
必要な場合に、このProcess
オブジェクトが表すプロセスが終了するまで現在のスレッドを待機させます。boolean
この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()
からのCompletableFuture
はcompletedになります。 -
destroyForcibly
public Process destroyForcibly()プロセスを強制的に強制終了します。 このProcess
オブジェクトによって表されるプロセスは、強制終了されます。 強制的なプロセス破壊は、プロセスの即時終了として定義されますが、正常終了は、プロセスが正常に終了することを可能にします。 プロセスが生存していない場合、何も実行されません。プロセスが終了すると、
onExit()
からのCompletableFuture
はcompletedになります。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は、プロセスが終了するかどうかを確認するために、プロセスがdoneかwaitかどうかを確認するために使用できます。 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()) { ... }
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
-