ArrayBlockingQueue阻塞队列实现生产者消费者模式
public class Demo {
@Test
public void test() throws InterruptedException {
new Thread(new Customer()).start();
new Thread(new Producer()).start();
new Thread(new Customer()).start();
new Thread(new Producer()).start();
while (Thread.activeCount() > 2){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Store{
private volatile static Store instance;
private AtomicInteger index;
private ArrayBlockingQueue<Integer> queue;
private Store(){
index = new AtomicInteger();
queue = new ArrayBlockingQueue<>(3);
}
public static Store getInstance(){
if (instance == null){
synchronized (Store.class){
if (instance == null){
instance = new Store();
}
}
}
return instance;
}
public void put(){
int i = index.incrementAndGet();
try {
queue.put(i);
System.out.println("生产:" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void take(){
Integer take;
try {
take = queue.take();
System.out.println("\t 消费" + take);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Customer implements Runnable{
private Store store;
public Customer(){
store = Store.getInstance();
}
@Override
public void run() {
for (int i = 0; i < 10; i++){
store.take();
}
}
}
class Producer implements Runnable{
private Store store;
public Producer(){
store = Store.getInstance();
}
@Override
public void run() {
for (int i = 0; i < 10; i++){
store.put();
}
}
}

用ArrayBlockingQueue实现了生产者消费者模式,但是运行输出的时候会出现问题,输出显示的是没生产就有了消费或者生产数超过了最大数。猜测队列的插入和取出没问题,可能是插入完成后,还没输出,CPU的时间片就到了,跳到取出的操作。如果是这个问题的话,有办法让输出也能够一致么
...全文
相关推荐
java并发之ArrayBlockingQueue详细介绍
主要介绍了java并发之ArrayBlockingQueue详细介绍的相关资料,需要的朋友可以参考下
Java中的阻塞队列详细介绍
主要介绍了Java中的阻塞队列详细介绍的相关资料,需要的朋友可以参考下
生产消费者模式实现方式和线程安全问题代码示例
主要介绍了生产消费者模式实现方式和线程安全问题代码示例,具有一定借鉴价值,需要的朋友可以参考下
java并发学习之BlockingQueue实现生产者消费者详解
主要介绍了java并发学习之BlockingQueue实现生产者消费者详解,具有一定参考价值,需要的朋友可以了解下。
java集合框架 arrayblockingqueue应用分析
ArrayBlockingQueue是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素


Java SE
