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#,您应该将 Queue 标记为volatile. 这将强制并发运行的线程在每次尝试访问队列时重新检查队列的值,而不是缓存对象。

如果您想了解更多信息,这篇文章很好地解释了关键字。

于 2012-12-31T17:02:43.303 回答
1

使用线程安全队列,例如任何BlockingQueue实现,它应该可以解决您的问题。

于 2013-01-01T08:10:47.607 回答