この説明が正しいかどうかはわかりませんが、ここに説明があります。
次のようなクライアント側のメッセージ処理システムがあります:(別のスレッドで実行されます)
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)
、プロセッサを無限に食べないようにするための最良の方法を実際に追加したことですか.