14个Java并发容器,你用过几个?( 二 )


10.LinkedBlockingDeque 阻塞队列(基于双向链表)
类似LinkedBlockingQueue,但提供了双向链表特有的操作 。
11.PriorityBlockingQueue 线程安全的优先队列
构造时可以传入一个比较器,可以看做放进去的元素会被排序,然后读取的时候按顺序消费 。某些低优先级的元素可能长期无法被消费,因为不断有更高优先级的元素进来 。
12.SynchronousQueue 数据同步交换的队列
一个虚假的队列,因为它实际上没有真正用于存储元素的空间,每个插入操作都必须有对应的取出操作,没取出时无法继续放入 。

14个Java并发容器,你用过几个?

文章插图
 
可以看到,写入的线程没有任何sleep,可以说是全力往队列放东西,而读取的线程又很不积极,读一个又sleep一会 。输出的结果却是读写操作成对出现 。
JAVA中一个使用场景就是Executors.newCachedThreadPool(),创建一个缓存线程池 。
14个Java并发容器,你用过几个?

文章插图
 
13.LinkedTransferQueue 基于链表的数据交换队列
实现了接口TransferQueue,通过transfer方法放入元素时,如果发现有线程在阻塞在取元素,会直接把这个元素给等待线程 。如果没有人等着消费,那么会把这个元素放到队列尾部,并且此方法阻塞直到有人读取这个元素 。和SynchronousQueue有点像,但比它更强大 。
14.DelayQueue 延时队列
可以使放入队列的元素在指定的延时后才被消费者取出,元素需要实现Delayed接口 。
总结
上面简单介绍了JAVA并发包下的一些容器类,知道有这些东西,遇到合适的场景时就能想起有个现成的东西可以用了 。想要知其所以然,后续还得再深入探索一番 。

作者:Java架构师追风
链接:https://www.jianshu.com/p/4da93376edda
来源:简书




推荐阅读