为什么在某些情况下Java队列无法轮询数据?

问题描述

下面的代码可以在控制台中显示0〜9。

public static void main(String[] args) {
    Queue<String> queue = new LinkedList<>();

    new Thread(() -> {
        System.out.println("start");
        for (int i = 0; i < 10; i++) {
            queue.add(String.valueOf(i));
        }
        System.out.println("end");
    }).start();

    while (true) {
        String data = queue.poll();
        if (data != null) {
            System.out.println(data);
        }
    }
}

但是为什么下面的代码不能?
唯一的区别是在将每个数据添加到队列之前,添加线程休眠一秒钟。

public static void main(String[] args) {
    Queue<String> queue = new LinkedList<>();

    new Thread(() -> {
        System.out.println("start");
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printstacktrace();
            }
            queue.add(String.valueOf(i));
        }
        System.out.println("end");
    }).start();

    while (true) {
        String data = queue.poll();
        if (data != null) {
            System.out.println(data);
        }
    }
}

感谢您的回复

解决方法

我相信这可以解决问题:

import java.util.LinkedList; 
import java.util.Queue; 
  public class HelloWorld{

        public static void main(String[] args) {
    Queue<String> queue = new LinkedList<>();

    new Thread(() -> {
        System.out.println("start");
        for (int i = 0; i < 10; i++) {
            try {
                 queue.add(String.valueOf(i));
                Thread.sleep(1000);

            } catch (InterruptedException e) {//InterruptedException
                e.printStackTrace();
            }
            
        }
        System.out.println("end");
    }).start();

    while (true) {
        String data = queue.poll();
        if (data != null) {
            System.out.println(data);
        }
    }
}
}