2010-11-21 3 views
1

JavaのスレッドがHttpServiceから始まっています。Javaで共通のデータがない場合にスレッド間で通知を指定する方法

ProcessBuilder pb = new ProceeBuilder(command); 
Process process = pb.start(); 
process.waitFor(); 

サービスが開始されているかどうかを確認する別のスレッドがあります。

while (result != 0) { 
    ServerSocket socket = new ServerSocker(port); 
    socket.close(); 
    result = 0 
    catch (BindException be) { 
    result = 1; 
    } 
} 

ここで、サービスの開始に失敗したか、正常に開始されたかについての情報を何とか取得する必要があります。これをMainクラスに戻す必要があります。Mainクラスは、これらのスレッドの両方を開始して処理を進めます。何かのように

while (!started || !failed) { 
    wait for getting information from the threads. 
} 

アドバイスはありますか? ありがとうございます。

+0

を使用すると、サービスが開始されたかどうかを確認するために、第2のスレッドが必要なのか、なぜ?メインスレッドでスタートアップを待つことはできませんか?つまり、httpサービスを起動し、waitFor(serverStarted())のようなものを呼び出しますか? http://tempus-fugit.googlecode.com/svn/site/documentation/time.html#Conditionを参照してください。 – Toby

答えて

1

両方のスレッドに渡すコールバックの使用はどうですか?

(省略のtry-漁獲量)

public class MyCallback { 
    private Boolean processSuccess; 
    private Boolean serviceSuccess; 
    public synchronized void notifyProcessStart(boolean success) { 
    this.processSuccess = success; 
    this.notifyAll(); 
    } 
    public synchronized void notifyServiceCheck(boolean success) { 
    this.serviceSuccess = success; 
    this.notifyAll(); 
    } 
    public synchronized void waitForResult() { 
    while(processSuccess == null || serviceSuccess == null) { 
     this.wait(); 
    } 
    // ... do something good 
    } 
} 
0

私は非常に申し訳ありませんが、私は、サービスが開始されていることを確認し、あなたのコードにバグがあることを恐れています。 このコードは非常に速く実行されており、サーバーソケットを起動して直ちに閉じます。プロセスが同じポートをリッスンし始めるときにこのスレッドが終了することを意味するなら、それは間違っています。プロセスが正常に起動する確率は50%、失敗した場合は50%が失敗します。これは、監視犬が同じポート自体をリッスンしているポートを聴き始めるためです。

だから、私はあなたが(あなたがやっているとおりに)ProcessBulderを使用してプロセスを実行しようとした後、すなわち

private boolean isServiceRunning() { 
    int port = 123; 
    try { 
     new Socket("localhost", port).close(); 
     return true; 
    } catch (IOException e) { 
     return false; 
    } 
} 

このメソッドは、このポートにを接続しようとする遅延ウォッチドッグタスクを開始すべきであると信じています別のスレッドから呼び出す必要があります。スレッドを実装する最善の方法は、あなたのためにそれを行ういくつかのツールを使用することです。この場合、java.util.Timerが最適な選択です。このソリューションは、あなたのために良いではない場合、私は待機を使用してスレッド間通信を実装するために、あなたをお勧めしたい

new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 
      if(isServiceRunning()) { 
       this.cancel(); 
      } 
     } 

    }, new Date(), 10000); 

しかし:私は私達の方法isServiceRunning(呼び出し)と、結果がtrueの場合、それ自体がキャンセルされます定期的なタスクを実行するために示唆されています()とnotfify()です。両方が同期ブロックでなければならないことを忘れないでください。 幸運を祈る!

0

ブール値フラグを使用できます。あなたの例のコードを適応:

スレッド1:

ProcessBuilder pb = new ProcessBuilder(command); 
Process process = pb.start(); 
process.waitFor(); 
if(!wasConnectionEstablished()) { 
    setConnectionFailed(true); 
} 

はスレッド2:

while ((result != 0) && (!isConnectionFailed())) {   
    ServerSocket socket = new ServerSocker(port);   
    socket.close();   
    result = 0   
    catch (BindException be) {   
     result = 1; 
     wait(timeout); 
    } 
} 
if(isConnectionFailed()) 
    throw new ConnectionFailedException(); 
else setConnectionEstablished(true); 
//continue normal execution 
+0

AEW、IPCとは – yart

+0

私はその部分を編集しました。それについてもっと考えた後、プロセスについての私の欲求は私が当初思っていたほど重要ではありませんでした。 IPCはプロセス間通信です。 – AEW

関連する問題