runnable中的无限循环消失了吗?

时间:2016-05-17 00:08:40

标签: java multithreading loops queue runnable

一些简化的代码来说明我的问题:

public class QueriesQueueRunnable implements Runnable {

    private List<String> queue = new ArrayList<String>();


    @Override
    public void run() {
        while(true){
            if (!this.getQueue().isEmpty()) {
                    System.out.println(this.getQueue().get(0));
                    this.getQueue().remove(0);

            }
        }
    }
}
QueriesQueueRunnable queriesQueueRunnable = new QueriesQueueRunnable();
Thread thread = new Thread(queriesQueueRunnable).start();




for (int i = 0; i < 1000; i++) {
     if(i==500){
         try {
                Thread.sleep(5000);                 
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
     }
    queriesQueueRunnable.getQueue().add(String.valueOf(i));
}

输出仅在i == 499迭代之前显示。为什么?这就像执行超出了可运行的循环。

Java 1.7

1 个答案:

答案 0 :(得分:0)

虽然你的代码是goToGameScene(),但是另一个线程无休止且无结果地旋转,使得它很容易被JIT编译器优化。由于该线程无法知道sleep正在更新,因此优化程序会假定queue将永远返回queue.isEmpty()并完全跳过检查。

避免此问题的一种方法是创建true字段queue,它通知JVM其他线程可以同时修改该值:

volatile

请注意,虽然这可以解决您的特定问题,但您的代码仍然远离线程安全,因为private volatile List<String> queue = new ArrayList<String>(); 并不意味着并发访问。

另请注意,您的程序永远不会完成,除非您将辅助线程设为daemon thread