摘要:是线程安全的存取队列,继承了。接口插入方法阻塞队列满了,抛出异常。如果队列不为空,返回头结点但不删除,如果队列为空,返回子类一个由数组结构组成的有界阻塞队列。一个由链表结构组成的有界阻塞队列。一个支持优先级排序的无界阻塞队列。
BlockingQueue
BlockingQueue是线程安全的存取队列,继承了Queue。
使用场景消费者生产者模式。
生产者,一直会往队列里扔数据,直到队列满了,开始阻塞,等待消费者取数据。
消费者,一直会从队列里取数据,直到队列空了,开始阻塞,等待生产者扔数据。
接口 插入方法add:阻塞队列满了,抛出IllegalStateException异常。成功返回true。
offer:插入成功,返回true,插入失败,返回false。
put:阻塞队列满了,就等到,可被中断,抛出InterruptedException异常
移除方法remove:成功返回true,为空抛出NoSuchElementException异常
poll:如果队列不为空,移除并返回头结点,如果队列为空,返回null
take:如果队列不为空,移除并返回头结点,如果队列为空,则等待,可被中断,抛出InterruptedException异常
检查方法:element:如果队列不为空,返回头结点但不删除,如果队列为空,抛出NoSuchElementException异常。
peek:如果队列不为空,返回头结点但不删除,如果队列为空,返回null
子类ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级排序实现的无界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
ArrayBlockingQueue先进先出,初始化必须给数组大小,只有一个锁。
LinkedBlockingQueue先进先出,初始化没有给链表带下,默认为Integer.MAX_VALUE,有两个锁。
PriorityBlockingQueue可以直接通过Comparator或者Collection的Comparator进行排序,一个锁。
DelayQueueDelayQueue中的对象必须实现Delayed接口,延时取元素。
使用场景:
订单到期未付款,取消订单
删除过期的缓存
SynchronousQueue因为不存储数据,所以每一次put,都要等待一个take。
LinkedTransferQueue先进先出,如果消费者在等待接收元素,transfer方法把元素直接给消费者,如果没有,则放对队列的尾节点,并等到消费结束后返回。tryTransfer无论消费者是否消费,都直接返回。
LinkedBlockingDeque头部和尾部,都可以添加或移除元素。工作密取,就是用这个
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75681.html
摘要:是所有线程池实现的父类,我们先看看构造函数构造参数线程核心数最大线程数线程空闲后,存活的时间,只有线程数大于的时候生效存活时间的单位任务的阻塞队列创建线程的工程,给线程起名字当线程池满了,选择新加入的任务应该使用什么策略,比如抛异常丢弃当前 ThreadPoolExecutor ThreadPoolExecutor是所有线程池实现的父类,我们先看看构造函数 构造参数 corePool...
摘要:原理全称,当线程去获取资源的时候,会根据状态值来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 原理 全称AbstractQueuedSynchronizer,当线程去获取资源的时候,会根据状态值state来判断是否有锁,如果有锁,则加入到链表,链表里的线程,通过自旋,判断资源是否已经释放,如果释放,则获取资源。 AQS结构 ...
摘要:显示锁和内置锁内置锁优势代码简洁不会因为没释放锁,导致锁泄露。显示锁优势灵活性强,锁的获取可以被中断,可以尝试获取锁。接口接口主要方法如下获取锁尝试获取锁,表示未加锁的情况。会进行抢锁操作,如果获取不到锁,也会进入阻塞队列等到唤醒。 显示锁和内置锁 内置锁(Synchronized)优势 代码简洁 不会因为没释放锁,导致锁泄露。 显示锁(Lock)优势 灵活性强,锁的获取可以被中...
摘要:之前中提过,并发的时候,可能造成死循环,那么在多线程中可以用来避免这一情况。默认,当容量大于时,开始扩容并发数,默认,直接影响和的值,以及的初始化数量。初始化的数量,为最接近且大于的办等于的次方的值,比如,数量为,,数量为。 之前HashMap中提过,并发的时候,可能造成死循环,那么在多线程中可以用ConcurrentHashMap来避免这一情况。 Segment Concurrent...
摘要:思想把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。当一个线程执行完当前队列的任务时,他就会去窃取其他队列的任务来执行。当双端队列只有一个任务时,线程之间会竞争。 思想 把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。 步骤如下: 任务分割 结果汇总 示例图 showImg(https://segmentfault.com/img/bVb...
阅读 1703·2021-11-18 10:02
阅读 2220·2021-11-15 11:38
阅读 2668·2019-08-30 15:52
阅读 2191·2019-08-29 14:04
阅读 3232·2019-08-29 12:29
阅读 2087·2019-08-26 11:44
阅读 995·2019-08-26 10:28
阅读 831·2019-08-23 18:37