阻塞队列是一个支持两个附加操作的队列,这两个操作支持阻塞的插入和移除方法。
- 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
- 支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。
7个阻塞队列
ArrayBlockingQueue
一个用数组实现的有界阻塞队列,按照先进先出的原则对元素进行排序
默认情况下不保证线程公平的访问队列,所谓公平访问队列是指阻塞的线程,可以按照阻塞的先后顺序访问队列,即先阻塞先访问。非公平是对先等待的线程是非公平的,当队列可用时,阻塞的线程都可以争夺访问队列的资格,有可能先阻塞的队列最后才访问。
LinkedBlockingQueue
一个用链表实现的有界阻塞队列,此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出对元素进行排序。
ProiorityBlockingQueue
一个支持优先级的无界阻塞队列。默认情况下元素采取自然顺序升序排列。也可以用compareTo()方法指定排序规则
DelayQueue
一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口在创建元素时可以指定多久才能从队列中获取当前元素。
应用场景:
缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。
定时任务调度:使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行。比如Time