【MDOnline読者様限定コンテンツ】 なお、Processクラスには以下のようなメソッドも用意されている。たとえば、延々と処理をするようなプロセスを起動したとき、そのプロセスが終了するのを待つのであれば、waitForメソッドを使う。
☆プロセスが終了するまで待つ。呼び出したスレッドが待機状態になる int 《Process》.waitFor(); 戻り値:プロセスの終了コード 例外:InterruptedException:別のスレッドから割り込みにより発生する
☆終了したプロセスの終了コードを受け取る int 《Process》.exitValue(); 戻り値:終了コード(通常は0だと正常終了でそれ以外は異常終了)
☆プロセスを強制終了する void 《Process》.destory();
execで実行したプロセスの標準出力を、順次呼び出したプロセス側で取り込みながら、たとえばユーザにフィードバックしたいような場合には、次のようなプログラムが例を参考にしてもらいたい。スレッドを使うタイマークラスを作成するが、そのクラスのインスタンスが、execを実行したスレッドを、一定時間ごとに呼び出すというものだ。タイマーの側でinterruptメソッドを呼び出すと、waitForで例外が発生すると言う仕組みになっている。プログラムの断片で示すので、利用するときには適当にアレンジしてもらいたい。ここでは、fetchmailコマンドに-vオプションをつけて、POPサーバからの取込み具合を監視したいのだが、呼び出したプロセスの側の標準出力の結果を取り込み、さらに標準出力に出すことで、たとえばコンソールなどで呼び出したfetchmailの標準出力を見ることができるという具合だ。
// プロセスの呼び出し部分 try { String command = "/usr/bin/fetchmail -v"; Process p = Runtime.getRuntime().exec(command); InputStream inSt = p.getInputStream(); byte buffer[] = new byte[1024]; Timer t = new Timer(Thread.currentThread()); //タイマーのスレッドを作り t.start(); //処理をスタートさせる boolean processLive = true; //プロセスが稼働中かを示すフラグ while(processLive) //稼働中なら try { p.waitFor(); //プロセスの終了を待つ processLive = false; } catch(Exception e) { //一定時間ごとに割り込みで例外が発生 int cnt = inSt.read(buffer, 0, 1024); //そのタイミングでプロセスの標準出力から読み取り System.out.println(new String(buffer, 0, cnt)); //さらに標準出力へ出すことで結果が見える } t.noMoreTimer(); //プロセスが終わればタイマーは不要なので処理をとめる } catch(Exception e) { System.out.println(e.getMessage()); } // プロセスの呼び出し部分ここまで
/* 指定したスレッドに、一定時間ごとに割り込みを発生させるクラス */ class Timer extends Thread { boolean isNoMore = false; //タイマーの処理をやめるための変数 Thread receiverThread = null; //割り込みを送るスレッド public Timer(Thread receiver) { //割り込みを送るスレッドを引数にとって receiverThread = receiver; // このクラスをインスタンス化する }
public void run() { //スレッドによる並列処理で呼び出される while(isNoMore == false) { //実行を中止しないのなら try { Thread.sleep(1000); //ここでは1000ミリ秒ごとに } catch(Exception e) { System.out.println(e.getMessage());} receiverThread.interrupt(); //指定したスレッドに割り込みを送る } }
public void noMoreTimer() { //タイマー処理を中止させる isNoMore = true; } }
(この項、以上)
|