Java线程池队列PriorityBlockingQueue和SynchronousQueue详解
正文
public enum QueueTypeEnum { ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"), LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"), DELAY_QUEUE(3, "DelayQueue"), PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"), SYNCHRONOUS_QUEUE(5, "SynchronousQueue"), LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"), LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"), VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"), MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue"); }
PriorityBlockingQueue阻塞优先队列
一个支持优先级排序的无界阻塞队列;对元素没有要求,可以实现Comparable接口也可以提供 Comparator来对队列中的元素进行比较。通过构造函数传入的对象来判断,传入的对象必须实现comparable接口,并重写compareTo方法。可以按照自然排序或自定义排序的顺序在队列中对元素进行排序。
例如新建对象Person:
public class Person implements Comparable<Person>{ private int id; @Override public int compareTo(Person person) { return this.id > person.getId() ? 1 : ( this.id < person.getId() ? -1 :0); } }
每次添加一个元素,PriorityBlockingQueue中的person都会执行compareTo方法进行排序,但是只是把第一个元素排在首位,其他元素按照队列的一系列复杂算法排序。这就保障了每次获取到的元素都是经过排序的第一个元素。
SynchronousQueue
SynchronousQueue是一个不存储元素的阻塞队列,是BlockingQueue的一种,SynchronousQueue线程安全的。SynchronousQueue和其他的BlockingQueue不同的是SynchronousQueue的capacity是0。即SynchronousQueue不存储任何元素。消费者线程调用 take() 方法的时候就会发生阻塞,直到有一个生产者线程生产了一个元素,消费者线程就可以拿到这个元素并返回;生产者线程调用 put() 方法的时候也会发生阻塞,直到有一个消费者线程消费了一个元素,生产者才会返回。
SynchronousQueue内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试着取走的时候才可能存在,不取走而只想偷 窥一下是不行的,当然遍历这个队列的操作也是不允许的。
队列头元素是第一个排队要插入数据的线程,而不是要交换的数据。数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲到队列中。可以这样来理解:生产者和消费者互相等待对方,握手,然后一起离开。
SynchronousQueue的一个使用场景是在线程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,这个线程池根据需要(新任务到来时)创建新的线程,如果有空闲线程则会重复使用,线程空闲了60秒后会被回收。
以上就是Java线程池队列PriorityBlockingQueue和SynchronousQueue详解的详细内容,更多关于Java线程池队列的资料请关注脚本之家其它相关文章!
相关文章
自动配置@EnableAutoConfiguration问题
这篇文章主要介绍了自动配置@EnableAutoConfiguration问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-06-06java中并发Queue种类与各自API特点以及使用场景说明
这篇文章主要介绍了java中并发Queue种类与各自API特点以及使用场景说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06Java获取两个集合List的交集、补集、并集(相加)和差集(相减)的不同方式
这篇文章主要给大家介绍了关于Java获取两个集合List的交集、补集、并集(相加)和差集(相减)的不同方式,在一般操作中对于list集合取交集、差集、并集,比较简单,需要的朋友可以参考下2023-08-08SpringBoot整合RabbitMQ实战教程附死信交换机
这篇文章主要介绍了SpringBoot整合RabbitMQ实战附加死信交换机,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-06-06Executor拦截器高级教程QueryInterceptor的规范
今天小编就为大家分享一篇关于Executor拦截器高级教程QueryInterceptor的规范,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12
最新评论