タイトルJava Watch on the X》3 - 今度こそ「JavaからAppleScript」を実行する(4)カテゴリー開発情報, AppleScript, Java, Java Watch on the X
作成日2001/11/29 1:2:47作成者新居雅行
【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;
}
}

(この項、以上)
関連リンク