阻塞队列详述

mac2024-07-24  70

阻塞队列详述

1.BlockingQueue概述

ArrayBlockingQueue LinkedBlockingQueue DelayQueue PriorityBlockingQueue SynchronousQueue

共有方法:

抛异常:如果试图的操作无法立即执行,抛一个异常。特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等 待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是 true / false)。

.2.公平与非公平策略

假设: 处理需要1s,唤醒需要2秒 处理队列的4个消息,公平策略需要?10秒 非公平策略需要?4秒

3.ArrayBlockingQueue

package cn.tedu.queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.TimeUnit; import org.junit.Test; /* * 队列---ArrayBlockingQueue * 1.ArrayBlockingQueue底层是数组,一个由数组支持的有界阻塞队列 * 2.参数表示队列的初始化长度 * 3.此队列支持公平策略,也支持非公平策略 * 默认为非公平,如果要设置公平,添加第二个参数 * 参二:boolean,true表示公平 * 4.公平策略:来消费的线程排队,先到先得,每个线程都可以处理数据,效率低,吞吐量低 * 非公平策略:来消费的线程无需排队,谁抢到,谁消费,效率高,可能造成饥饿线程,吞吐量高 */ public class ArrayBlockingQueueDemo { @Test public void abqmethodTest() throws Exception{ ArrayBlockingQueue<Object> abq = new ArrayBlockingQueue<Object>(10,true); for (int i = 0; i < 10; i++) { abq.add(i); } //add抛异常 //abq.add(11); //offer队列满返回false //System.out.println(abq.offer(11)); //put队列满了会阻塞,用的比较多 //abq.put(11); //超时后,返回特定值 System.out.println(abq.offer(11, 5000, TimeUnit.MILLISECONDS)); } }

4.LinkedBlockingQueue

package cn.tedu.queue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.junit.Test; /* * 队列---LinkedBlockingQueue * 1.LinkedBlockingQueue底层是链表结构,也满足FIFO, * 一个基于已链接节点的、范围任意的阻塞队列 * 2.lbq是无界的,默认是Integer.MAXVALUE 2^31 * 3.链表增删性能好,也是经典的队列实现 */ public class LinkedBlockingQueueDemo { @Test public void lbqTest() throws Exception{ LinkedBlockingQueue<Object> lbq = new LinkedBlockingQueue<Object>(); //remove:队列为空,抛异常 //lbq.remove(); //poll:队列为空,获取为null //System.out.println(lbq.poll()); //take:阻塞 //lbq.take(); //超时后,返回null System.out.println(lbq.poll(5, TimeUnit.SECONDS)); } }

5.PriorityBlockingQueue

package cn.tedu.queue; public class Student implements Comparable<Student>{ private String name; private int age; public Student(String name,int age){ this.name = name; this.age = age; } @Override public int compareTo(Student o) { return this.age - o.getAge(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } } package cn.tedu.queue; import java.util.concurrent.PriorityBlockingQueue; import org.junit.Test; /* * 1.PriorityBlockingQueue是优先级队列, * 此队列需要实现Comparable接口 * 2.队列默认排序 * 3.能指定初始队列大小,后面插入元素的时候,如果空间不够的话会自动扩容 */ public class PriorityBlockingQueueDemo { @Test public void createPbqTest(){ PriorityBlockingQueue<Student> pbq = new PriorityBlockingQueue<Student>(4); Student s1 = new Student("zhangsan",22); Student s2 = new Student("lisi",8); Student s3 = new Student("wangwu",88); Student s4 = new Student("xiaoming",66); pbq.add(s1); pbq.add(s2); pbq.add(s3); pbq.add(s4); for (int i = 0; i < 4; i++) { System.out.println(pbq.poll()); } } }

6.其他队列

SynchronousQueue:只能够容纳单个元素。 BlockingDeque:两端都能增删

最新回复(0)