Java 无法获取预期的输出多线程阻塞队列

Java 无法获取预期的输出多线程阻塞队列,java,Java,我们正在尝试从多线程环境中的阻塞队列获取数据 正如我们所知,阻塞队列是线程安全的,并且以FIFO方式从阻塞队列中获取数据。但没有得到预期的产出 请查找以下程序以供参考 package com.example.demo; class PriceTask implements Runnable { @Override public void run() { while (true) { try { String

我们正在尝试从多线程环境中的阻塞队列获取数据

正如我们所知,阻塞队列是线程安全的,并且以FIFO方式从阻塞队列中获取数据。但没有得到预期的产出

请查找以下程序以供参考

package com.example.demo;

class PriceTask implements Runnable {
    @Override
    public void run() {
        while (true) {
            try {
                String data = QueueData.bq.take();
                System.out.println(data);
            } catch (Exception ex) {

            }
        }
    }
}

public class SimpleTestDemo {
    public static void main(String[] args) throws Exception {
        QueueData obj1 = new QueueData();
        obj1.m1();
        Thread t1 = new Thread(new PriceTask(), "T1");
        Thread t2 = new Thread(new PriceTask(), "T2");
        t1.start();
        t2.start();
    }
}

package com.example.demo;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class QueueData {

    public static final BlockingQueue<String> bq = new LinkedBlockingQueue<String>();   

    public void m1() throws InterruptedException {
        bq.put("Data--01");
        bq.put("Data--02");
        
        bq.put("Data--03");
        bq.put("Data--04");
        
        bq.put("Data--05");
        bq.put("Data--06");
        
        bq.put("Data--07");
        bq.put("Data--08");
        
        bq.put("Data--09");
        bq.put("Data--10");
    }
}
预期产量

Data--01
Data--02
Data--03
Data--04
Data--05
Data--06
Data--07
Data--08
Data--09
Data--10

take
方法被阻塞时,
PriceTask
中的循环体不是原子的。换句话说,虽然数据是按顺序获取的,但不能保证从队列中检索项目后不会出现上下文切换,并且可以在当前项目之前检索和打印另一个项目

一种确定项目打印顺序的方法是同步循环体。例如:

class PriceTask实现可运行{
@凌驾
公开募捐{
while(true){
试一试{
已同步(PriceTask.class){
String data=QueueData.bq.take();
系统输出打印项次(数据);
}
}捕获(例外情况除外){
}
}
}

您要从同一队列读取多线程PriceTask,但需要对数据进行顺序处理。这是矛盾的。如果您需要顺序处理,则使用单线程PriceTask

Data--01
Data--02
Data--03
Data--04
Data--05
Data--06
Data--07
Data--08
Data--09
Data--10