乐趣区

关于java:JAVA并发编程阻塞队列理论及其API介绍

1. 阻塞队列的基本概念

2. 阻塞队列的罕用 API 介绍

1. 阻塞队列的基本概念用
咱们在介绍阻塞队列前,先看一张图:

这是一个最根本的生产者和消费者的模型图,一个线程放数据,一个线程取数据。两头是放数据的队列,队列就是一个盛放数据的数组。
阻塞队列:
当阻塞队列是空的,从队列中获取元素的操作将会被阻塞。
当阻塞队列是满的,往队列里增加元素的操作会被阻塞。
直到其中的线程从队列中移除一个或者有线程往里插入数据时,将不会阻塞。
而 JAVA 中,咱们次要应用的阻塞接口,就是 BlockingQueue!

BlockingQueue<E>


由上图能够看出,BlockingQueue 的接口继承 Queue 接口,而 Queue 接口和 List 接口又同时继承于 Collection 接口,咱们罕用的阻塞队列类型有三种:

ArrayBlockingQueue : 由数组形成的有界阻塞队列
LinkedBlockingQueue : 由链表组成的有界(然而默认值为 Integer.MAX_VALUE 阻塞队列)
SynchronousQueue : 不存储元素的阻塞队列,即单个元素的队列。

2. 阻塞队列的罕用 API 介绍

我先列出一个表,当前应用 API 查问这个表格就能够了,而后进行挨个地演示和测验

形式 抛出异样 不抛出异样,有返回值 阻塞期待 超时期待
增加 add() offer() put() offer(E e, long timeout, TimeUnit unit)
删除 remove() poll() take() poll(E e, long timeout, TimeUnit unit)
判断队列值 element() peek()

咱们就用一个长度为 3 的一般数组阻塞队列拿来测试:

BlockingQueue<String> blockingQueue = new ArrayBlockingQueue(3);

首先是,抛出异样组

        // 抛出异样组 API
        blockingQueue.add("b");
        blockingQueue.add("c");
        blockingQueue.add("d");
        blockingQueue.add("d");

后果是抛出异样:

剩下的两个办法,当队列为空的时候,都抛出异样,在这里我就不演示了。

接下来是 不抛出异样,有返回值组

        // 返回值组
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("a"));

后果为:

阻塞期待组

        // 阻塞期待组
        blockingQueue.put("e");
        blockingQueue.put("e");
        blockingQueue.put("e");
        blockingQueue.put("e");

如果阻塞队列满了,那么直到阻塞队列存中的音讯被生产之前,就始终阻塞。

如图:主线程始终在运行

接下来是 超时期待组
阻塞期待就是在队列阻塞的时候,如果超过肯定的工夫,就放弃期待:

    // 阻塞期待组

        blockingQueue.offer("e", 1, TimeUnit.SECONDS);
        blockingQueue.offer("e", 1, TimeUnit.SECONDS);
        blockingQueue.offer("e", 1, TimeUnit.SECONDS);
        blockingQueue.offer("e", 5, TimeUnit.SECONDS);


能够看出咱们的程序运行了一会儿之后就完结了。

总结:
这篇文章咱们简略地介绍了一下阻塞队列以及其 API 的应用,能够截图保留下面的表格,在当前须要应用到 API 的时候,进行查阅便能够了。

退出移动版