1. Javaプロセスの作成
Javaは、プロセスまたはその他のプログラムを開始する2つの方法を提供します。
(1)Runtimeのexec()Method(2)ProcessBuilderのstart()Method(2)を使用する
1.1 ProcessBuilder
ProcessBuilderクラスは、J2SE 1.5によってJava.langに新たに追加された新しいクラスです。 J2SE 1.5の前に、プロセス制御と管理はプロセスクラスによって実装されました。
各ProcessBuilderインスタンスは、プロセスプロパティのセットを管理します。 start()メソッドは、これらのプロパティを使用して新しいプロセスインスタンスを作成します。 start()メソッドは、同じインスタンスから繰り返し呼び出され、同じプロパティまたは関連プロパティを備えた新しい子プロセスを作成できます。
各プロセスジェネレーターは、これらのプロセスプロパティを管理します。
コマンドは、呼び出される外部プログラムファイルとそのパラメーター(ある場合)を表す文字列のリストです。ここで、有効なオペレーティングシステムコマンドを表す文字列のリストはシステムに依存します。たとえば、すべての変数は通常このリストの要素になりますが、プログラムがコマンドライン文字列自体をマークすることを望むオペレーティングシステムがあります - そのようなシステムでは、Javaの実装では、これら2つの要素を正確に含めるためにコマンドが必要になる場合があります。
環境は、変数から値へのシステム依存マッピングです。初期値は、現在のプロセス環境のコピーです(system.getenv()を参照)。
作業ディレクトリ。デフォルト値は、現在のプロセスの現在の作業ディレクトリであり、通常はSystem Property user.dirに従って指定されています。
RedirecterrorStreamプロパティ。当初、このプロパティは虚偽です。つまり、子どもプロセスの標準出力とエラー出力は、Process.getInputStream()およびprocess.getErrorStream()メソッドを介してアクセスできる2つの独立したストリームに送信されます。値がtrueに設定されている場合、標準誤差は標準出力とマージされます。これにより、エラーメッセージと対応する出力を簡単に関連付けることができます。この場合、マージされたデータは、process.getInputStream()によって返されたストリームから読み取ることができますが、プロセスから読み取られたストリームはファイルの最後に直接到達します。
プロセスビルダーのプロパティを変更すると、オブジェクトのstart()メソッドによって開始された後続のプロセスに影響しますが、以前に開始されたプロセスまたはJava自体に影響することはありません。ほとんどのエラーチェックは、start()メソッドによって実行されます。オブジェクトの状態は変更できますが、Start()はこの方法で失敗します。たとえば、コマンドプロパティを空のリストに設定しても、start()が含まれていない限り、例外はスローされません。
このクラスは同期していないことに注意してください。複数のスレッドがプロセスビルダーに同時にアクセスし、少なくとも1つのスレッドがプロパティの1つを構造的に変更する場合、外部同期を維持する必要があります。
建設方法の概要
ProcessBuilder(List <String>コマンド)
指定されたオペレーティングシステムプログラムとパラメーターを使用してプロセスジェネレーターを構築します。
ProcessBuilder(String ...コマンド)
指定されたオペレーティングシステムプログラムとパラメーターを使用してプロセスジェネレーターを構築します。
メソッドの概要
list <string> command()
このプロセスジェネレーターのオペレーティングシステムプログラムとパラメーターを返します。
ProcessBuilderコマンド(リスト<String>コマンド)
このプロセスジェネレーターのオペレーティングシステムプログラムとパラメーターを設定します。
ProcessBuilderコマンド(String ...コマンド)
このプロセスジェネレーターのオペレーティングシステムプログラムとパラメーターを設定します。
file directory()
このプロセスジェネレーターの作業ディレクトリを返します。
ProcessBuilderディレクトリ(ファイルディレクトリ)
このプロセスジェネレーターの作業ディレクトリを設定します。
map <string、string> environment()
このプロセスジェネレーター環境の文字列マッピングビューを返します。
boolean redirecterrorStream()
標準エラーと標準出力をマージするかどうかをプロセスジェネレーターに通知します。
ProcessBuilder RedirectErrorStream(Boolean RedirecterrorStream)
このプロセスジェネレーターのRedirecterrorStreamプロパティを設定します。
Process start()
このプロセスジェネレーターのプロパティを使用して、新しいプロセスを開始します。
1.2ランタイム
各Javaアプリケーションにはランタイムクラスインスタンスがあり、アプリケーションが実行される環境に接続できるようになります。現在のランタイムは、GetRuntimeメソッドを介して取得できます。
アプリケーションは、独自のランタイムクラスインスタンスを作成することはできません。ただし、GetRuntimeメソッドを使用して、現在のランタイムランタイムオブジェクトへの参照を取得できます。現在のランタイムオブジェクトへの参照を取得したら、Runtimeオブジェクトメソッドを呼び出して、Java仮想マシンの状態と動作を制御できます。
Javaコードコレクションコード
void addshutdownhook(スレッドフック)
新しい仮想マシンを登録して、フックをオフにします。
int vayaverProcessors()
利用可能なプロセッサの数をJava仮想マシンに返します。
プロセスexec(stringコマンド)
別のプロセスで指定された文字列コマンドを実行します。
プロセスexec(string [] cmdarray)
指定されたコマンドと変数を別のプロセスで実行します。
プロセスexec(string [] cmdarray、string [] envp)
指定された環境の別のプロセスで指定されたコマンドと変数を実行します。
Process Exec(string [] cmdarray、string [] envp、file dir)
指定された環境と作業ディレクトリで、個別のプロセスで指定されたコマンドと変数を実行します。
プロセスexec(string command、string [] envp)
指定された環境の別のプロセスで指定された文字列コマンドを実行します。
プロセスexec(string command、string [] envp、file dir)
指定された環境と作業ディレクトリを使用して、別のプロセスで指定された文字列コマンドを実行します。
void exit(int status)
仮想マシンのシャットダウンシーケンスを起動して、現在実行されているJava仮想マシンを終了します。
long freememory()
Java仮想マシンの自由メモリの量を返します。
void gc()
ゴミコレクターを実行します。
inputstream getLocalizedInputStream(inputStream in)
廃止。 JDK 1.1から始めて、ローカルにエンコードされたバイトストリームをUnicode文字ストリームに変換するための好ましい方法は、inputStreamReaderおよびBufferedReaderクラスを使用することです。
outputStream getLocalizedOutputStream(outputStream out)
廃止。 JDK 1.1から始めて、Unicode文字ストリームをローカルにエンコードされたバイトストリームに変換するための好ましい方法は、outputStreamWriter、BufferedWriter、およびPrintWriterクラスを使用することです。
静的ランタイムgetRuntime()
現在のJavaアプリケーションに関連付けられたランタイムオブジェクトを返します。
void Halt(int status)
強制的に、現在実行中のJava仮想マシンを終了します。
void load(string filename)
指定されたファイル名を動的ライブラリとしてロードします。
void loadlibrary(string libname)
指定されたライブラリ名にダイナミックライブラリをロードします。
long maxmemory()
Java仮想マシンが使用しようとするメモリの最大量を返します。
Boolean RemoveShutDownhook(スレッドフック)
以前に登録された仮想マシンを登録して、フックをオフにします。
void runfinalization()
ファイナライゼーションを停止するすべてのオブジェクトの終了方法を実行します。
静的void runfinalizersonexit(ブール値)
廃止。 この方法自体は安全ではありません。使用されているオブジェクトの最終的な方法を呼び出す場合がありますが、他のスレッドがそれらのオブジェクトで動作しているため、動作やデッドロックが誤っています。
long totalmemory()
Java仮想マシンのメモリの合計量を返します。
無効なトレースストラクチャ(ブールオン)
コマンド追跡を有効/無効にします。
void tracemethodcalls(boolean on)
メソッドコールトラッキングを有効/無効にします。
1.3プロセス
どの方法がプロセスを開始するために使用されていても、プロセスクラスのインスタンスが開始プロセスを表します。これは、プロセスを制御して関連情報を取得するために使用できます。プロセスクラスは、プロセス入力から実行する方法、プロセスの実行、プロセスの完了を待ち、プロセスの出口ステータスを確認し、プロセスを破壊(殺す)方法を提供します。
void Destroy()
子どものプロセスを殺します。
一般的に言えば、この方法は開始されたプロセスを殺すことができないため、使用しない方が良いです。
int exitvalue()
子プロセスの出口値を返します。
ExitValue()メソッドは、スタートアッププロセスが実行を完了した後、または例外のために実行された後にのみ通常の返品値になります。そうしないと、例外がスローされます。
inputstream getErrorStream()
子プロセスのエラーストリームを取得します。
エラー出力がリダイレクトされている場合、エラー出力をストリームから読み取ることはできません。
inputstream getInputStream()
子プロセスの入力ストリームを取得します。
プロセスの標準出力は、このストリームから読み取ることができます。
outputStream getOutputStream()
子プロセスの出力ストリームを取得します。
ストリームに書き込まれたデータは、プロセスへの標準入力として使用されます。
int waitfor()
プロセスオブジェクトで表されるプロセスが終了するまで、必要に応じて、現在のスレッドが待機します。
2。マルチプロセスプログラミングの例
一般に、Javaの他のクラスでメソッドを実行すると、静的呼び出しであろうと動的呼び出しであろうと、現在のプロセスで実行されます。つまり、実行中のJava仮想マシンインスタンスは1つだけです。時々、Javaコードを介して複数のJavaサブプロセスを開始する必要があります。これを行うと、システムのリソースが増えますが、新しく開始されたプログラムが異なる仮想マシンプロセスで実行されると、プログラムがより安定します。
Javaでは、この要件を実現するために2つの方法を使用できます。最も簡単な方法は、実行時にExecメソッドを介してJavaクラス名を実行することです。実行が成功した場合、このメソッドはプロセスオブジェクトを返します。以下の簡単な例を見てみましょう。
// test1.javaファイルImport java.io。 ; system.out.println(「正常に」)。 exec( "Java test1");
Java test_execを介してプログラムを実行した後、Cドライブに追加のtest1.txtファイルがあることがわかりましたが、出力情報はコンソールに表示されませんでした。したがって、テストは正常に実行されたと結論付けることができますが、何らかの理由で、テストの出力情報はtest_execのコンソールに出力されません。この理由は、TEST_EXECの子プロセスがExecを使用して作成されているため、非常に簡単です。
子プロセスの出力情報を出力する場合は、getInputStreamの出力(子プロセスの出力、親プロセスの入力)を介して子プロセスの出力ストリームを取得し、子の出力ストリームを転送できます。親プロセスのコンソール出力からのプロセス。特定の実装コードは次のとおりです。
// test_exec_out.javaimport java.io。*; public class test_exec_out {runtime run = runtime.getRuntime(); = new BufferedInputStream(p.getInputStream()); ;上記のコードからわかるように、test_exec_out.javaでは、子プロセスの出力情報が行ごとに読み取られ、出力は各行でtest_exec_outで実行されます。 上記の議論は、子プロセスの出力情報を取得する方法です。次に、出力情報に加えて、入力情報もあります。子プロセスには独自のコンソールがないため、入力情報も親プロセスによって提供される必要があります。プロセスのGetOutputStreamメソッド(つまり、コンソールからの入力情報ではなく、親プロセスから子プロセスへの入力情報)を使用して、子プロセスに入力情報を提供できます。次のコードを見ることができます。
// test2.javaファイルImport java.io。*; public class test {public static void main(string [] args){bufferedreader br = new bufferedreader(new inputstreamread er(system.in)); "親プロセスが入力した情報:" + br.readline()); // test_in.javaimport java.io。 .getRuntime(); exec( "Java test2"); flush();上記のコードから、test1がtest_exec_inによって送信された情報を取得し、出力することがわかります。 bw.flash()とbw.close()を追加しない場合、情報は子プロセスに到達しません。つまり、子プロセスはブロッキング状態になりますが、親プロセスが終了したため、子プロセスも終了します。 。これを証明する場合は、最後にsystem.in.read()を追加してから、タスクマネージャー(Windowsの下)を介してJavaプロセスを表示できます。 .close()、1つのJavaプロセスのみが存在します。削除された場合、2つのJavaプロセスが存在します。これは、情報がtest2に渡された場合、情報を取得した後にtest2が終了するためです。 Execの実行は非同期であり、実行される特定のプログラムがブロックされているため、次のコードの実行を停止しないことを説明することの1つがあります。したがって、test2を実行した後、次のコードを実行できます。
Execメソッドは何度もリロードされています。上記で使用されるのは、単なる過負荷です。また、exec( "java.test2")などのコマンドとパラメーターをexec( "java"、 "test2")として記述できるように分離することもできます。 Execは、指定された環境変数を介して異なる構成でJava仮想マシンを実行することもできます。
RuntimeのExecメソッドを使用して子プロセスを構築することに加えて、ProcessBuilderを介して子プロセスを構築することもできます。 ProcessBuilderの使用は次のとおりです。
// test_exec_out.javaimport java.io。*; public class test_exec_out {public static void main(string [] args){processbuilder pb = new processbui lder( "java"、 "test1"); ;…}}チャイルドプロセスを確立するには、プロセスビルダーはランタイムに似ています。プロセスを取得した後、彼らの操作はまったく同じです。
Runtimeと同様に、ProcessBuilderは、実行可能ファイルの環境情報、作業ディレクトリなどを設定することもできます。次の例では、ProcessBuilderを使用してこの情報を設定する方法について説明します。
ProcessBuilder PB = new ProcessBuilder( "command"、 "arg2"、 "arg2"、 '' '); //環境変数マップ<文字列> env = pb.environment(); env.put( "key1"、 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: ::::::::::::::::::::::::::: "value1"); env.remove( "key2"); env.put( "key2"、env .get( "key1" + "_test");