2014-03-27 35 views
0

我遇到了一个奇怪的现象,当我尝试在我创建的线程使用一个成员变量,它不返回正确的值,下面是我的代码片段如何在java线程中正确使用变量?

new Thread() { 
     public void run() { 
      while (true) { 
       //System.out.println(printQueue.isEmpty()); 
       while ((currentOrder = printQueue.poll())!= null) { 
        printall(); 
       } 
      } 
     } 
    }.start(); 

printQueue是我定义了一个队列,当我尝试将值推入队列时结果不同。
当我取消注释打印行时,此currentOrder将返回一个非null变量,但如果我对该行注释,则currentOrder将始终返回null。 它是如何发生的以及我应该如何解决它?

+3

是什么类型的打印队列?它是线程安全的吗? –

+0

'队列 printQueue = new LinkedList ()'和PrintInfo是我定义的类。 – richard

回答

2

LinkedList类不适用于多线程应用程序。单独的线程可以在本地存储器中缓存LinkedList的状态,这可能会导致状态显示不一致。

您应该改为使用java.util.concurrent.BlockingQueue,看看是否可以解决问题。这可能是线程没有看到更新的问题,但写入System.out正在导致线程本地内存被刷新。

如果您想了解更多的这是怎么回事就在这里,你可能要参考这个问题:

What does flushing thread local memory to global memory mean?