0

問題があります。

私のクライアントは特定の時間サーバーからリッスンする必要があり、その時間内にサーバーからの応答を受信しない場合は、接続を閉じる必要があります。

クライアントには2つのスレッドがあり、1つは時間の経過後にブール変数をfalseに更新し、もう1つのスレッドはサーバーからのメッセージとタイマーをチェックします。

私のコードは次のようなものです:

while(true){
    if(l=is.readLine().equals(msg))
    {
        // do processing
        break;
    }
    if(timer)
        break;
}

そのため、while ループは msg と timer を継続的にチェックします。問題は is.readline() が呼び出しをブロックしており、サーバーからのメッセージを無期限に待っていることです。

どうすればいいですか?

私は試した

if(l=is.readLine()!=null and l.equals(msg)) 

しかし、うまくいきませんでした。

4

5 に答える 5

0

この場合、@Peter が言ったように、ポーリングが最良の代替手段だと思います。しかし、2 つのスレッドを使用してそれを行うこともできます。

NetworkThread implements Runnable, Closeable{
BufferedReader r;
volatile boolean readyToClose = false;
@Override
public void run(){
//initialize r as t = new BufferedReader(new InputStreamReader(socket.getInputStream()))
String s = null;
while((s= r.readLine())!=null){
  readyToClose = true;
 //do whatever
}
}
public void close() throws IOException
{
   if(readyToClose()
     r.close();
}
}

その期間ブロックされる別のスレッドを用意します ( sleep)。そして、 を呼び出しますNetworkThread#close()。これによりストリームが閉じられ、他のスレッドがループから抜け出します。

于 2013-04-25T08:02:33.357 に答える
0

みんなありがとう...

この問題の簡単な解決策を見つけました...

readlineを呼び出す前に、バッファにデータがあるかどうかを確認しています

if(ir.ready())
    ir.readLine()

上記は、ブロックされていない場合にのみ readLine を呼び出します。

于 2013-04-26T07:47:21.517 に答える
-1

この目的で CountdownLatch を使用できます。ネットワーク スレッドを開始し、カウントダウン ラッチで await を呼び出します。

CountDownLatch latch = new CountDownLatch(1);

// start network thread
networkThread.start();

boolean wasFinished = latch.await(you_timeout);

// Interrupt network thread as it still waiting:
if(!wasFinished) {
    networkThread.interrupt();
}

読み取り成功後のネットワーク スレッドで、latch.countDown(); を呼び出します。

于 2013-04-25T07:42:16.490 に答える