搞不懂的知识四

一、阻塞队列
      阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列,同时,阻塞队列里面的put、take方法是被加:synchronized 同步限制。
二、几种常见阻塞队列
 1、BlockingQueue (常用)
    获取元素的时候等待队列里有元素,否则阻塞 
     保存元素的时候等待队列里有空间,否则阻塞 
     用来简化生产者消费者在多线程环境下的开发 2、ArrayBlockingQueue (数组阻塞队列)
    FIFO、数组实现 
    有界阻塞队列,一旦指定了队列的长度,则队列的大小不能被改变 
    在生产者消费者例子中,如果生产者生产实体放入队列超过了队列的长度,则在offer(或者put,add)的时候会被阻塞,直到队列的实体数量< 队列的 初始size为止。不过可以设置超时时间,超时后队列还未空出位置,则offer失败。 
  如果消费者发现队列里没有可被消费的实体时也会被阻塞,直到有实体被生产出来放入队列位置,不过可以设置等待的超时时间,超过时间后会返 回null 
3、DelayQueue (延迟队列)
     有界阻塞延时队列,当队列里的元素延时期未到是,通过take方法不能获取,会被阻塞,直到有元素延时到期为止 
     如: 
      1.obj 5s 延时到期 
      2.obj 6s 延时到期 
      3.obj 9s 延时到期 
    那么在take的时候,需要等待5秒钟才能获取第一个obj,再过1s后可以获取第二个obj,再过3s后可以获得第三个obj 
    这个队列可以用来处理session过期失效的场景,比如session在创建的时候设置延时到期时间为30分钟,放入延时队列里,然后通过一个线程来获       取这个队列元素,只要能被获取到的,表示已经是过期的session,被获取的session可以肯定超过30分钟了,这时对session进行失效。 
    4、LinkedBlockingQueue (链表阻塞队列)
     FIFO、Node链表结构 
     可以通过构造方法设置capacity来使得阻塞队列是有界的,也可以不设置,则为无界队列 
     其他功能类似ArrayBlockingQueue 
5、PriorityBlockingQueue (优先级阻塞队列)
    无界限队列,相当于PriorityQueue +
BlockingQueue 
 插入的对象必须是可比较的,或者通过构造方法实现插入对象的比较器Comparator<? super E> 
 队列里的元素按Comparator<? super E> comparator比较结果排序,PriorityBlockingQueue可以用来处理一些有优先级的事物。比如短信发送优先     级队列,队列里已经有某企业的100000条短信,这时候又来了一个100条紧急短信,优先级别比较高,可以通过PriorityBlockingQueue来轻松实现 这样的功能。这样这个100条可以被优先发送 
 6、SynchronousQueue (同步队列)
     无内部容量的阻塞队列,put必须等待take,同样take必须等待put。比较适合两个线程间的数据传递。异步转同步的场景不太适用,因为对于异步 线程来说在处理完事务后进行put,但是必须等待put的值被取走。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值