layout: post title: “2020-03-06-生产者消费者模型.markdown” date: 2020-03-06 12:11:30 +0800

  1. BlockingQueue 是实现典型生产者消费者模型的接口 在生产者和消费者 不能工作时产生阻塞。
  2. 生产者消费者模型的经典代码(take get) ``` public class Supplier extends Thread { BlockingQueue queue; public static AtomicInteger i = new AtomicInteger(0); String tag;

    public Supplier(BlockingQueue queue, String tag) { this.queue = queue; this.tag = tag; }

    @Override public void run() { while (true) { int value = i.addAndGet(1); try { queue.put(tag + “_” + value); } catch (InterruptedException e) { e.printStackTrace(); } try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }

    } }

public class Consumer extends Thread { BlockingQueue queue; String tag;

public Consumer(BlockingQueue<String> queue, String tag) {
    this.queue = queue;
    this.tag = tag;
}

@Override
public void run() {
    while (true) {
        try {
            System.out.println(tag + " : " + queue.take());
        } catch (InterruptedException e) {
            System.out.println("e:" + e.getMessage());
            e.printStackTrace();
        }
    }

} }

public static void main(String[] args) { LinkedBlockingQueue lbd = new LinkedBlockingQueue(); System.out.println("start..."); new Consumer(lbd, "c1").start(); new Consumer(lbd, "c2").start(); new Supplier(lbd, "s1").start(); new Supplier(lbd, "s2").start(); }

```

  1. 几种实现类和原理 LinkedBlockingQueue,ArrayBlockingQueue,SynchronousQueue,PriorityBlockingQueue,DelayQueue ArrayBlockingQueue 是固定大小的Queue,取数据会根据当前头所在index LinkedBlockingQueue 不限定大小 底层都是ReentrantLock