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
支持从两个端点方向检索和插入元素
java容器(Queue)
猜你喜欢
转载自blog.csdn.net/xhf852963/article/details/81291022
今日推荐
周排行