我的线程不适用于我的队列

时间:2012-12-31 16:59:34

标签: java multithreading queue

我是多线程的菜鸟,所以这可能是一个愚蠢的问题;) 但我有一个线程,它使用一个队列,在线程运行时将填充命令。我在这里遇到的问题是,线程没有看到队列中的更改,因此当我尝试访问队列中的元素时,它会一直返回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());
    }
  }
}

3 个答案:

答案 0 :(得分:2)

在队列的实现中可能存在某种问题;我没有其他解释为什么读取循环没有看到变化。

那就是说,这看起来像是一种不好的方式来实现它。只要等待添加消息,您的线程就会“旋转”,以极快的速度咀嚼CPU。您需要能够通知您的读者有些(可能)元素添加到队列中,而不是连续轮询它。查找关于Object方法等待和notifyAll的教程;基本思想是你的读者线程在一个对象上执行wait,并挂起该线程,直到它再次使用notifyAll启动。整个课程对于SO答案来说太大了。

答案 1 :(得分:1)

假设这是Java或C#,您应该将队列标记为volatile。这将强制并发运行的线程在每次尝试访问队列而不是缓存对象时重新检查队列的值。

如果您想了解更多信息,this post可以很好地解释关键字。

答案 2 :(得分:1)

使用线程安全队列,例如any of the BlockingQueue implementations,它应该可以解决您的问题。