1

この説明が正しいかどうかはわかりませんが、ここに説明があります。

次のようなクライアント側のメッセージ処理システムがあります:(別のスレッドで実行されます)

public void run() {
    String line;

    while(true)
    {
        try
        {
            while ((line = reader.readLine( )) == null) { Thread.sleep(10); }; 

            if (line.toUpperCase().startsWith("PING ")) {
                // Autorespond to server pings
                server.Write("PONG " + line.substring(5));
            }
            else {
                setChanged();
                notifyObservers(line);
            }
        }
        catch (Exception e)
        {
            //do something here
        }
    }

}

私が本当に、本当にやりたいのは、この行を置き換えることです:while ((line = reader.readLine( )) == null) { Thread.sleep(10); }本質的に無限ループではない何か他のものに置き換えます.

コードの内訳 行に何らかのデータが含まれるまで無限にループします。ping 要求の場合は、自動応答して最初からやり直します。そうでない場合は、受信したメッセージでオブザーバーに通知し、最初からやり直します。

オブザーバーモデルは機能しますが、それについて心配する必要はありません。リーダーは実際にはそのまま機能します...しかし、無限ループに座って物事をチェックするために大量のプロセッサを消費します。

質問 BufferedReader が実際に読み取るデータを取得するまでスレッド自体が単純に待機するように、ある種の同時実行、待機、またはその他のモデルを使用するにはどうすればよいですか? それを行う方法はありますか、それともThread.Sleep(10)、プロセッサを無限に食べないようにするための最良の方法を実際に追加したことですか.

4

2 に答える 2

-1

ifreaderは socket/(unknown-length stream) に関連付けられているため、行末がないため、null が返されません。ここで最も重要なことはプロトコルであることを知っています。クライアントとサーバーの両方がデータの送受信方法を知っている必要があります。たとえば、HTTPプロトコルではヘッダーのサイズが不明であるため、サーバーとクライアントの両方が空の行を期待します( \r\n) 魔女は終わりを示しますヘッダーの。したがって、最初は独自のプロトコルを用意する必要があり、次に null 値に注意してください。

public void run() {
    String line;

    while(true)
    {
        try
        {
            while (true) {
            line = reader.readLine( );//it throws exception if client/server closes the stream.
            if(line==null){return;/*break;*/}
            if (line.toUpperCase().startsWith("PING ")) {
                // Autorespond to server pings
                server.Write("PONG " + line.substring(5));
            }
            else {
                setChanged();
                notifyObservers(line);
            }
        }
        catch (Exception e)
        {
            //do something here
        }
      }
    }

}

Thread.sleep()また、2年であっても、データが利用可能になるまでI / O操作がブロックされるため、必要はありません。

于 2013-10-14T09:03:49.250 に答える