并发-无阻塞队列
ConcurrentLinkedQueue并发无阻塞队列,BlockingQueue并发阻塞队列。
ConcurrentLinkedQueue实现Queue接口,BlockingQueue本身是一个接口,继承Queue接口。
ConcurrentLinkedQueue
- 无阻赛、无锁、高性能、无界队列(直至内存耗尽)、线程安全,性能优于BlockingQueue、不允许null值
- 使用CAS算法进行入队和出队操作
栗子1:ConcurrentLinkedQueue基本操作
1 | public class DemoThread29 { |
执行结果:
1 | [1, 2, 3, 4] |
ArrayBlockingQueue
不允许添加null元素,三种添加方法都不允许添加null元素
添加方法
add:如果队列满了,抛出异常
1
java.lang.IllegalStateException: Queue full
offer:如果队列满了,不阻塞,不抛出异常。可以设置最大阻塞时间。
1
2// 可设置最大阻塞时间,5秒,如果队列还是满的,则不阻塞,不抛出异常
queue.offer(6, 5, TimeUnit.SECONDS);
put:如果队列满了,永远阻塞,不抛出异常
获取方法
peek:读取头元素不移除。如果队列为空,返回null,不阻塞, 不抛异常
poll:读取头元素,并移除。如果队列为空,返回null,不阻塞, 不抛异常。可以设置最大最大阻塞时间
1
2// 可指定阻塞时间,2秒,如果队列依然为空,则返回null,不抛异常
queue.poll(2, TimeUnit.SECONDS)
take:读取头元素,并移除。如果队列为空,则永远阻塞,不抛出异常
转换方法
drainTo:取出queue中指定个数的元素放入集合中,并移除。如果队列为空时,不阻塞,不抛出异常
1
queue.drainTo(list, 2);
栗子1:drainTo转换为List
1 | public static void testTake2() { |
执行结果:
1 | list>>[1, 2] |
栗子2:空队列drainTo转换
1 | public static void testTake3() { |
执行结果:
1 | 1>>[1, 2, 3] |