高并发编程基础——JUC(BlockingQueue阻塞式队列)

引入:

什么是JUC?JUC指的是JDK1.5中提供的一套并发包及其子包:java.util.concurrent,java.util.concurrent.lock,java.util.concurrent.atomic 。其中主要内容包括:阻塞式队列、并发映射、锁、执行器服务、原子性操作 。

阻塞式队列(blocking queue):

概念:

阻塞式队列,它也是队列,是队列那就遵循FIFO。需要注意的是,阻塞式队列的容量在声明时就已经固定了,不可以扩容并且BQ中不允许元素为null。

阻塞性的体现:

1.队列空,线程获取队列中的元素时,线程会阻塞。
2.队列满,线程放入元素到队列中时,线程会阻塞。

向BQ中添加元素的方法:

1.add:队列已满则会抛出异常 - IllegalStateException: Queue full

queue.add("a");

2.offer:队列满了返回false,不会阻塞,会继续执行下面的语句

boolean b = queue.offer("c");
System.out.println(b);

3.put: 队列满,产生永久阻塞,线程停止在那里不动。

queue.put("d");

4.offer:定时阻塞,队列满了后,会在设定的时间内发生线程阻塞,超时就停止阻塞,往下执行。

 boolean b = queue.offer("e", 5, TimeUnit.SECONDS);
 System.out.println(b);

向BQ中获取元素的方法:

获取到的都是头元素:

1.remove:队列为空,抛出异常 - NoSuchElementException

queue.remove()

2.poll:队列满了,返回null

queue.poll()

3.队列满,产生永久阻塞,线程停止在那里不动

queue.take()

4.poll:定时阻塞,会在设定的时间内发生线程阻塞,超时就停止阻塞,往下执行

queue.poll(5, TimeUnit.SECONDS)

blocking queue的常用实现类:

1.ArrayBlockingQueue - 阻塞式顺序队列:
底层:数组

要求:声明的时候必须指定容量。

ArrayBlockingQueue<String> queue =new ArrayBlockingQueue<>(5);
        queue.add("a");
        queue.add("a");
        queue.add("a");
        queue.add("a");
        queue.add("a");

2.LinkedBlockingQueue - 阻塞式链式队列:
底层:节点来储存数据

要求:在使用的时候可以指定容量也可以不指定。如果指定容量,则容量不可变;如果不指定容量,则容量默认为Integer.MAX_VALUE = 231-1不可变。因为实际开发中,一般不会在队列中存储21亿个元素,所以一般认为此时的容量是无限的

LinkedBlockingQueue<String> queue =new LinkedBlockingQueue<>();

3.PriorityBlockingQueue - 具有优先级的阻塞式队列:
底层:数组。

要求:使用的时候可以指定容量也可以不指定。如果不指定则默认初始容量是11

特点:这个队列中如果存入的是基本数据类型,则会按照字典顺序排序。如果是自定义类型,则需要实现Comparable接口,覆盖compareTo方法指定比较规则 。PriorityBlockingQueue在迭代遍历的时候不保证排序。
当然也可以不使用匿名内部类的方法,如果不使用,就不需要传入比较器了。

//匿名内部类重写比较方法
 Comparator<Student> c = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
            //降序
                return o2.getScore() - o1.getScore();
            }
        };
//传入容量和比较器        
PriorityBlockingQueue<Student> queue =new PriorityBlockingQueue<>(5, c);

猜你喜欢

转载自blog.csdn.net/weixin_42596778/article/details/106793879