目录
1.公平访问队列
对于阻塞的生产者线程和消费者线程而言,当队列可用时,可以按照阻塞的先后顺序访问队列;先阻塞的生产者线程可以先往队列中插入元素,先阻塞的消费者线程可以先从队列中获取元素。但公平访问队列会降低吞吐量。
2.Java中常见的阻塞队列
1.ArrayBlockingQueue:由数组结构组成的有界阻塞队列
2.LinkedBlockingQueue:由链表结构组成的有界阻塞队列
3.PriorityBlockingQueue:支持优先级排序的无界阻塞队列
4.DelayQueue:支持延时获取元素的无界阻塞队列
5.SynchronousQueue:不存储元素的阻塞队列
6.LinkedTransferQueue:由链表结构组成的无界阻塞队列
7.LinkedBlockingDeque:由链表结构组成的双向阻塞队列
3.ArrayBlockingQueue
由数组实现的有界阻塞队列,按照先进先出FIFO原则对元素进行排序的队列。默认情况下不保证访问者公平的访问队列。
4.LinkedBlockingQueue
由链表结构组成的有界阻塞队列,按照先进先出FIFO原则对元素进行排序的队列。对生产者和消费者分别采用了独立锁控制数据同步,从而在高并发的情况下使得生产者和消费者能够并行的操作队列中的数据,从而提高并发性能。
5.PriorityBlockingQueue
支持优先级排序的无界阻塞队列,元素采取自然顺序按照升序排列。通过实现compareTo()方法改变元素排序规则,但无法保证同优先级元素的顺序。
6.DelayQueue
支持延时获取元素的无界阻塞队列。队列中的元素必须实现Delayed接口,创建元素时可以指定多久能从那个队列中获取当前元素,到达该延迟时间才可以获得元素。一般用于缓存系统和定时任务调度。
7.SynchronousQueue
不存储元素的阻塞队列,负责把生产者线程处理的数据直接传递给消费者线程,队列本身不会存储任何元素,因此吞吐量高于ArrayBlockingQueue和LinkedBlockingQueue
8.LinkedTransferQueue
由链表结构组成的无界阻塞队列,比其他阻塞队列多了transfer()和tryTransfer()方法。
transfer():若当前有消费者正等待接收元素(消费者调用take方法),transfer()会将生产者传入的元素立刻传输给消费者;若当前没有消费者等待接收元素,transfer()会将元素存放在队列中,等待该元素被消费者消费后返回
tryTransfer():用来确定生产者传入的元素能否直接传给消费者,没有消费者等待接受元素,则立即返回false
9.LinkedBlockingDeque
由链表结构组成的双向阻塞队列,可以从队列两端插入或移除元素。应用于“工作窃取”模式中
10.后台线程与用户线程的区别
1.Java中有两种线程:后台线程(守护线程)Daemon、用户线程User
2.后台线程的定义
后台线程,也称为守护线程,是为用户线程提供公共服务的线程,在没有用户线程可服务时会自动离开。守护线程的优先级比较低,用于为系统中其他对象和线程提供服务。通过方法setDaemon(true)将线程设置为后台线程;且在Daemon线程中产生的新线程也是Daemon的;垃圾回收线程是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,垃圾回收线程会自动离开。后台线程是JVM级别的,独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。
3.区别:根据JVM什么时候离开判断。后台线程为其他线程服务,当没有用户线程后,JVM自动离开