1

私はマルチスレッドの初心者なので、これはおそらくばかげた質問になります;)しかし、スレッドの実行中にコマンドでいっぱいになるキューを使用するスレッドがあります。私がここで抱えている問題は、スレッドがキュー内の変更を認識しないため、キュー内の要素にアクセスしようとするとnullを返し続けることです。これで何か助けはありますか?

//This method will add an command to the queue
public void sendCommand( String Command )
{
  qe.add(Command);
}

public void run()
{
  while( true )
  {
    while(qe.peek() != null)
    {
      sendCommandToDevice(qe.poll());
    }
  }
}
4

3 に答える 3

2

おそらく、キューの実装に何らかの問題があります。読み取りループで変更が表示されない理由については、他に説明がありません。

とはいえ、これはこれを実装するための悪い方法のように見えます。メッセージが追加されるのを待つときはいつでも、スレッドは「スピン」し、CPUを高速でかみ砕きます。キューを継続的にポーリングするのではなく、キューに(おそらく)要素が追加されていることをリーダーに通知するものが必要です。ObjectメソッドwaitとnotifyAllに関するチュートリアルを検索してください。基本的な考え方は、リーダースレッドがオブジェクトに対して待機を実行し、notifyAllで再開されるまでスレッドを一時停止することです。レッスン全体がSOの答えには大きすぎます。

于 2012-12-31T17:35:07.067 に答える
1

これがJavaまたはC#であると仮定すると、キューをとしてマークする必要がありますvolatile。これにより、同時に実行されているスレッドは、オブジェクトをキャッシュするのではなく、キューにアクセスしようとするたびにキューの値を再チェックするように強制されます。

より多くの情報が必要な場合は、この投稿はキーワードを説明するのにかなり良い仕事をします。

于 2012-12-31T17:02:43.303 に答える
1

いずれかのBlockingQueue実装などのスレッドセーフキューを使用すると、問題が解決するはずです。

于 2013-01-01T08:10:47.607 に答える