Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的线程没有';我不能处理我的队列_Java_Multithreading_Queue - Fatal编程技术网

Java 我的线程没有';我不能处理我的队列

Java 我的线程没有';我不能处理我的队列,java,multithreading,queue,Java,Multithreading,Queue,我是多线程的noob,所以这可能是一个愚蠢的问题;) 但是我有一个线程,它使用一个队列,当线程运行时,队列中会充满命令。我在这里遇到的问题是,线程没有看到队列中的更改,因此当我尝试访问队列中的元素时,总是返回null。有什么帮助吗 //This method will add an command to the queue public void sendCommand( String Command ) { qe.add(Command); } public void run() {

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

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


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

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


如果您需要更多信息,请很好地解释关键字。

也许在队列的实现中存在某种问题;对于为什么读取循环没有看到更改,我没有其他解释


这就是说,这看起来是一个糟糕的实现方式。您的线程将“旋转”,在等待添加消息的任何时候都会以很快的速度占用CPU。您需要一些东西来通知您的读者有(可能)元素添加到队列中,而不是连续轮询它。查找有关对象方法wait和notifyAll的教程;其基本思想是读者线程对对象执行wait,并挂起线程,直到使用notifyAll再次启动。整个课程对于SO答案来说太大了。

也许在队列的实现中存在某种问题;对于为什么读取循环没有看到更改,我没有其他解释



这就是说,这看起来是一个糟糕的实现方式。您的线程将“旋转”,在等待添加消息的任何时候都会以很快的速度占用CPU。您需要一些东西来通知您的读者有(可能)元素添加到队列中,而不是连续轮询它。查找有关对象方法wait和notifyAll的教程;其基本思想是读者线程对对象执行wait,并挂起线程,直到使用notifyAll再次启动。整个课程对于SO答案来说太大了。

使用线程安全队列,如,它应该可以解决您的问题。

使用线程安全队列,如,它应该可以解决您的问题。

哦,对不起,忘了提一下:这是Java!也许队列的实现没有使用“synchronized”所使用的队列是线程安全的吗?您使用的是什么队列类?哦,对不起,忘了提一下:它是Java!可能队列的实现没有使用“已同步”队列使用的是线程安全的吗?您使用的是什么队列类?您是否使用附加的调试器运行代码以跟踪进程?您确定所有线程都在执行吗?如果队列标记为volatile,changed,然后read,那么应该保证它处于正确的状态。我已经对此进行了测试,线程正在运行,队列在整个程序中都在变化,但由于某些原因,线程仍然没有看到更改—1使队列易变不会产生任何影响—它只保证重新分配
qe=new queue()
将可见,但队列中添加的内容将不可见。您是否在运行代码时附带了跟踪进程的调试器?您确定所有线程都在执行吗?如果队列标记为volatile,changed,然后read,那么应该保证它处于正确的状态。我已经对此进行了测试,线程正在运行,队列在整个程序中都在变化,但由于某些原因,线程仍然没有看到更改-1使队列不稳定不会产生任何影响-它只保证重新分配
qe=new queue()
将可见,但并不是说队列中添加的内容是可见的。
BlockingQueue
比用wait/notify混日子要好得多——这是我还没有遇到过的java 6的一个特性。谢谢。实际上,
BlockingQueue
已经存在了,因为5A
BlockingQueue
比用wait/notify混日子要好——这是我还没有遇到过的java 6的一个特性。谢谢。实际上,
BlockingQueue
从5点就开始了