1.阻塞队列和非阻塞队列的区别?
答:
阻塞队列:当队列时空的,从队列中获取元素操作将会被阻塞,或者当队列满时,往队列里面添加时将会被阻塞。
2.有哪些队列?
答:
1.ArrayDeque (数组双端队列)
2.PriorityQueue (优先级队列)
3.ConcurrentLinkedQueue(基于链表的并发队列)
4.DelayQueue (延期阻塞队列,阻塞队列实现了BlockingQueue接口)
5.ArrayBlockingQueue (基于数组的并发阻塞队列)
6.LinkedBlockingQueue (基于链表的FIFO阻塞队列)
7.LinkedBlockingDeque (基于链表的FIFO双端阻塞队列)
8.PriorityBlockingQueue (带优先级的无阻塞队列)
9.SynchronousQueue (并发同步阻塞队列)
3.ConcurrentLinkedQueue简介
答:
1.ConcurrentLikedDeque是一个适用于高并发场景下的队列,通过无锁的方式实现,实现了高并发状态下的高性能。
2.通常ConcurrentLinkedDeque性能要好于BlockingQueue,它是一个基于链接节点无界线程安全队列。
3.遵循先进先出(FIFO)原则,队列不允许为null元素。
4.add()方法和offer()方法都是添加元素。在ConcurrentLinkedDeque中这两个了方法无区别。
5.pool()和peek()都是取头元素节点。区别在于前者会删除该元素节点,后者不会。
4.ArrayBlockingQueue简介
答:
1.ArrayBlockingQueue是一个有界的阻塞队列
2.内部实现是一个数组。
3.先进先出(FIFO),最近插入的的数据是尾部,最新移除的数据是头部。
5.LinkedBlockingQueue简介
答:
1.LinkedBlockingQueue是一个可配置的队列大小的阻塞队列。如果初始化时指定队列大小,那就是有界队列,如果没有指定,那就是无界队列(无界:采用了默认大小为Integer.MAX_VALUE的容量)
2.内部实现是一个链表。
3.先进先出(FIFO)。
6.PriorityBlockingQueue简介
答:
1.是一个无界队列,排序规则和java.util.PriorityQueue一样。
2.允许插入null对象。所有插入PriorityBlockingQueue的对象必须实现java.lang.Comparable接口,队列优先级的排序规则是根据我们对这个接口的实现来定义的。
3.可以从PriorityBlockingQueue获得一个迭代器Iterator,但这个迭代器并不保证按照优先级顺。
7.SynchronousQueue简介
答:
1.SynchronousQueue队列内部只允许容纳一个元素,当一个线程插入一个元素后会被阻塞,除非这个元素被另一个线程消费。