Queue容器

158 阅读3分钟

文章来源于网上尚未实践验证,等项目需要再验证更改

Queue容器

Queue三个子接口BlockingQueue(阻塞队列)和Deque(双端队列)和BlockingDeque Queue在高并发的情况下可以使用两种队列  1:ConcurrentLinkedQueue 内部加锁(实现类)    2:BlockingQueue阻塞式队列(子接口),两个实现类(LinkedBlockingQueue,ArrayBlockingQueue)

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