阻塞队列实现生产者消费者

xiaoxiao2021-02-28  93

阻塞队列 Blocking Queue

当队列空时,获取元素的线程会等待 当队列满时,存储元素的线程会等待

主要有以下几种: ArrayBlockingQueue :一个由数组结构组成的 有界 阻塞队列。 此队列按照先进先出(FIFO)的原则对元素进行排序。

LinkedBlockingQueue :一个由链表结构组成的 有界 阻塞队列。 此队列按照先进先出(FIFO)的原则对元素进行排序。

PriorityBlockingQueue :一个支持优先级排序的 无界 阻塞队列。 默认情况下元素采取自然顺序排列,也可以通过比较器 comparator 来指定元素的排序规则。元素按照升序排列。

DelayQueue:一个使用优先级队列实现的无界阻塞队列。

SynchronousQueue:一个不存储元素的阻塞队列。

LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。

LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

操作方法 插入: add(e):抛出异常 offer(e):返回特殊值 put(e):一直阻塞 offer(e,time,unit):超时退出

移除: remove():抛出异常 poll():返回特殊值 take():一直阻塞 poll(time,unit):超时退出


生产者消费者是一道经典的题,现在我们用阻塞队列来实现它。

package com.zl; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Created by acer on 2017/5/7. */ public class ProducerConsumerTest { public static void main(String[] args) { BlockingQueue<Produce> p = new LinkedBlockingQueue<Produce>(10); //固定容器大小为10 Thread produce = new Thread(new Producer(p)); Thread consume = new Thread(new Consumer(p)); produce.start(); consume.start(); } } /** * 生产者 */ class Producer implements Runnable { private BlockingQueue<Produce> p; Producer(BlockingQueue<Produce> p) { this.p = p; } @Override public void run() { int i = 0; while (true) { try { //当生产的产品数量装满了容器,那么在while里面该产品容器(阻塞队列)会自动阻塞 wait状态 等待消费 p.put(new Produce("产品" + i)); i++; } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 消费者 */ class Consumer implements Runnable { private BlockingQueue<Produce> p; Consumer(BlockingQueue<Produce> p) { this.p = p; } @Override public void run() { try { Thread.sleep(1000); //用于测试当生产者生产满10个产品后是否进入等待状态 while (true) { //当容器里面的产品数量为空时,那么在while里面该产品容器(阻塞队列)会自动阻塞 wait状态 等待生产 Produce food = p.take(); System.out.println("消费" + food.getId()); } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 产品 */ class Produce { private String id; public String getId() { return id; } public Produce(String id) { this.id = id; System.out.println("生产" + id); } }
转载请注明原文地址: https://www.6miu.com/read-79267.html

最新回复(0)