java容器(Queue)

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

猜你喜欢

转载自blog.csdn.net/xhf852963/article/details/81291022
今日推荐