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