2016-07-20 12 views
0

私は以下のようにサーバーに接続するクラスを持っています。Javaのスレッド間に "フラグ"を設定する

@Override 
public void run() { 
    while (running) { 
     try { 
      msgHandler.log("Connecting to " + host + ":" + port); 
      Socket s = new Socket(host, port); 

      if (s.isConnected() && !s.isClosed()) { 
       msgHandler.connectionInit(s); 
      } 
      BufferedInputStream input = new BufferedInputStream(s.getInputStream()); 

    } 
} 

msgHandlerであるコンシューマは、以下のように接続が切断されると、頻繁にソケットをポーリングします。

@Override 
public void connectionInit(Socket s) throws IOException { 
    logger.info("Connected to AWW Service on " + configuration.getAwwHost() + ":" + configuration.getAwwPort()); 

    output = new BufferedOutputStream(s.getOutputStream()); 

    connector.componentReady(); 
    Timer t = new Timer(); 
    t.schedule(new TimerTask() { 
     @Override 
     public void run() { 
       try { 
        pollServer(); 
       } catch (IOException e) { 
        // SOCKET GETS BROKEN HERE 
       } 
     } 
    }, 0, 25000); 

} 

質問は、どのように私は、ソケット接続を実行()スレッドに戻って壊れますときに私が得る例外から通信できているので、ソケットと、入力ストリームを再初期化しようとすることができますか?

ここでwait()はrun()スレッドをスリープ状態にするため、notify()またはwait()メカニズムは適切ではないと思います。 私は、接続が壊れたときにフラグを設定するのと同じことを考えていました。run()スレッドは常にフラグをチェックし、trueに設定されている場合はソケットを再初期化します。しかし、私はこれを達成するためにJavaに固有のより効率的なマルチスレッドアプローチがあると確信しています。

答えて

0

最も簡単なアプローチは、両方のスレッドからアクセス可能な変数AtomicBooleanを使用していると思います。必要に応じて、各スレッドの実行クラスを構築するときに変数を渡すことができます。 AtomicBooleanについての素晴らしいことは、スレッドセーフであること/同期化され、変更可能であるため、参照渡しで変更できることです。

さらに詳しい情報はsimilar questionを参照してください。

0

私はのrun()関数では、次のようなコードがあるはずです。エラーがpollServer()呼び出し中に発生した場合

// ... 
try 
{ 
    // ... 
    int read = input.read(...); 
    // ... 

} 
catch (IOException e) 
{ 
    // TODO: terminate the thread and restart a new connection 
} 

ので、また私の上記のコードは、例外を生成する必要があります。

Socketオブジェクトのclose関数を呼び出すと、入力ストリームと出力ストリームによって相対的な例外が生成されます。

関連する問題