文章来源于网上尚未实践验证,等项目需要再验证更改
Queue容器
Queue三个子接口BlockingQueue(阻塞队列)和Deque(双端队列)和BlockingDeque Queue在高并发的情况下可以使用两种队列 1:ConcurrentLinkedQueue 内部加锁(实现类) 2:BlockingQueue阻塞式队列(子接口),两个实现类(LinkedBlockingQueue,ArrayBlockingQueue)
- 公用方法
- strs.offer("xx"),往里面加数据,但是他有一个返回值boolean,可以判断值加没加成功 如果用add方法可能会出一些问题,可能有容量的限制,但是offer不会抛异常
- strs.poll(),拿出第一个元素,然后删掉它
- strs.peek(),拿出第一个元素,但是不删
- BlockingQueue公共方法浅析
- strs.put("xx"),将指定元素插入此队列中,若没有空间则阻塞
- take(),获取并移除此队列的头部,若空了,则等待
- LinkedBlockingQueue(BlockingQueue接口的实现类) 无界队列:没有界限,你往里面扔多少个元素都可以。LinkedBlockingQueue阻塞式容器(可实现消费者和生产者模式)
- ArrayBlockingQueue(BlockingQueue接口的实现类)
- 有界队列:队列里面能装的元素的个数是固定的
- 如果用add()方法在满了的情况下继续往里面加数据,就会报异常
- 如果用offer()方法在满了的情况下继续往里面加数据,不会报异常,但是不会把最会一个元素加进去,可通过返回值判断 strs.offer("xx",1,TimeUnit.SECONDS);1S钟之后加不进去就不往里面加了
- DelayQueue(BlockingQueue接口的实现类)
- 必须实现Delayed接口,执行定时任务
- DelayQueue:无界队列,加进去的每一个元素(理解成一个任务),这个元素什么时候可以让消费者往外拿,只有等一段时间之后才可以,每一个元素记载着自己还有多长时间可以被消费者拿走;默认是排好顺序的,等待时间最长的先往外拿
- TransferQueue 1.7新增,用在更多的高并发情况下;无界队列.提供了一个特殊的方法 strs.transfer("xx"),消费者先启动,生产者生产完并不是往队列里面扔,而是先去找消费者,如果有消费者,不往队列里面扔了,直接扔给消费者,如果生产者先启动,这个时候找不到消费者,他就会阻塞;如果用put()和add()和offer()都没问题,因为他容量不为0
- SynchronousQueue 同步队列,特殊的transferQueue;容量为0的无界队列 生产的任何东西,必须的消费者必须马上给我消费掉,不消费掉就会出问题;如果用add()就会报错,如果用put()没事,应为它阻塞等待消费者消费.
总结
- ConcurrentLinkedQueue 高并发情况下的队列
- BlockingQueue 阻塞式队列、LinkedBlockingQueue 无界队列、ArrayBlockingQueue 有界队列、DelayQueue 执行定时任务
- TransferQueue(1.7) 直接扔给消费者,没有消费者就阻塞
- SynchronousQueue(1.7) 特殊的TransferQueue,容量为0
- Deque 支持从两个端点方向检索和插入元素