阻塞队列BlockingQueue

53 阅读1分钟

什么是阻塞队列BlockingQueue

image.png

类图

image.png

核心方法

image.png

image.png

常用阻塞队列

ArrayBlockingQueue

由一个数组结构组成的有界Integer.MAX_VALUE阻塞队列

LinkedBlockingQueue

由一个链表结构组成的有界Integer.MAX_VALUE阻塞队列

SynchronousQueue

/ˈsɪŋkrənəs kjuː/ 一个不存储元素的阻塞队列。每一个put操作都要等待take操作,反之亦然。

代码演示

BlockingQueue<Integer> queue = new SynchronousQueue();
   
   new Thread(()->{
       try {
           System.out.println(Thread.currentThread().getName() + " put 1");
           queue.put(1);

           System.out.println(Thread.currentThread().getName() + " put 2");
           queue.put(2);

           System.out.println(Thread.currentThread().getName() + " put 3");
           queue.put(3);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }, "a").start();

    new Thread(()->{
        try {
            TimeUnit.SECONDS.sleep(3);
            System.out.println(Thread.currentThread().getName() + " " + queue.take());

            TimeUnit.SECONDS.sleep(3);
            System.out.println(Thread.currentThread().getName() + " " + queue.take());

            TimeUnit.SECONDS.sleep(3);
            System.out.println(Thread.currentThread().getName() + " " + queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }, "b").start();
}
结果分析:
空行表示每3秒打印
a put 1

b 1
a put 2

b 2
a put 3

b 3

Java并发编程艺术P167