什么是JUC?JUC指的是JDK1.5中提供的一套并发包及其子包:java.util.concurrent,java.util.concurrent.lock,java.util.concurrent.atomic 。其中主要内容包括:阻塞式队列、并发映射、锁、执行器服务、原子性操作 。
阻塞式队列,它也是队列,是队列那就遵循FIFO。需要注意的是,阻塞式队列的容量在声明时就已经固定了,不可以扩容并且BQ中不允许元素为null。
1.队列空,线程获取队列中的元素时,线程会阻塞。
2.队列满,线程放入元素到队列中时,线程会阻塞。
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);
获取到的都是头元素:
1.remove:队列为空,抛出异常 - NoSuchElementException
queue.remove()
2.poll:队列满了,返回null
queue.poll()
3.队列满,产生永久阻塞,线程停止在那里不动
queue.take()
4.poll:定时阻塞,会在设定的时间内发生线程阻塞,超时就停止阻塞,往下执行
queue.poll(5, TimeUnit.SECONDS)
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);