阿里巴巴国际站app,手机版网站建设软件,企业网站 源码 开源,公司注册资金认缴和实缴区别1.什么是阻塞队列 我们知道#xff0c;PriorityQueue、LinkedList这些都是非阻塞队列。在我们使用非阻塞队列的时候有一个很大问题#xff0c;它不会对当前线程产生阻塞#xff0c;那么在面对类似消费者-生产者的模型时#xff0c;就必须额外地实现同步策略以及线程间…1.什么是阻塞队列 我们知道PriorityQueue、LinkedList这些都是非阻塞队列。在我们使用非阻塞队列的时候有一个很大问题它不会对当前线程产生阻塞那么在面对类似消费者-生产者的模型时就必须额外地实现同步策略以及线程间唤醒策略这个实现起来就非常麻烦。但是有了阻塞队列就不一样了它会对当前线程产生阻塞比如一个线程从一个空的阻塞队列中取元素此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后被阻塞的线程会自动被唤醒不需要我们编写代码去唤醒。这样提供了极大的方便性。 2.阻塞队列的种类 阻塞队列本质上就是队列它主要有一下几种 ArrayBlockingQueue基于数组实现的阻塞队列先进先出队列有界队列。在创建时必须制定容量大小。并可以指定公平性与非公平性默认情况下是非公平的即不保证等待时间最长的队列最优先能够访问队列。LinkedBlockingQueue基于链表实现的阻塞队列先进先出队列有界队列。在创建时如果不指定容量大小则默认大小为Integer.MAX_VALUE。PriorityBlockingQueue按照元素的优先级对元素进行排序按照优先级顺序出队。并且该阻塞队列为无界阻塞队列即容量没有上限源码中它没有容器满的信号标志。DelayQueue基于PriorityQueue的延时阻塞队列无界队列。DelayQueue中的元素只有当其指定的延迟时间到了才能够从队列中获取到该元素。因为DelayQueue是一个无界队列所以往队列中插入数据的操作永远不会被阻塞而只有获取数据的操作才会被阻塞。SynchronousQueue一个不存储元素的阻塞队列。LinkedTransferQueue一个由链表结构组成的无界阻塞队列。LinkedBlockingDeque一个由链表结构组成的双向阻塞队列。3.阻塞队列中的几个主要方法 put方法用来向队尾存入元素如果队列满则等待 take方法用来从队首取元素如果队列为空则等待 offer方法用来向队尾存入元素如果队列满则等待一定的时间当时间期限达到时如果还没有插入成功则返回false否则返回true poll方法用来从队首取元素如果队列空则等待一定的时间当时间期限达到时如果取到则返回null否则返回取得的元素4.使用以LinkedBlockingQueue为例 import java.util.concurrent.LinkedBlockingQueue;public class BlockingQueueDemo {int size 10;LinkedBlockingQueueInteger queue new LinkedBlockingQueue(size);public static void main(String[] args) {BlockingQueueDemo bqd new BlockingQueueDemo();Consumer c bqd.new Consumer();Productor p bqd.new Productor();c.setName(消费者);p.setName(生产者);c.start();p.start();}class Consumer extends Thread {Overridepublic void run() {consume();}private void consume() {while (true) {try {queue.take();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() 消费了一个物品还有 queue.size() 个物品);}}}class Productor extends Thread {Overridepublic void run() {product();}private void product() {while (true) {try {queue.put(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() 生产了一个物品现有 queue.size() 个物品);}}}
} 转载于:https://www.cnblogs.com/ericz2j/p/10283533.html