1700451539
1700451540
阻塞队列和非阻塞队列有此区别的原因是阻塞队列是为了容纳(或排序)多线程任务而存在的,其服务的对象是多线程应用,而非阻塞队列容纳的则是普通的数据元素。我们来看一下ArrayBlockingQueue类最常用的add方法。
1700451541
1700451542
public class ArrayBlockingQueue<E>extends AbstractQueue<E>
1700451543
1700451544
implements BlockingQueue<E>,java.io.Serializable{
1700451545
1700451546
//容纳元素的数组
1700451547
1700451548
private final E[]items;
1700451549
1700451550
//元素数量计数器
1700451551
1700451552
private int count;
1700451553
1700451554
public boolean add(E e){
1700451555
1700451556
//调用offer方法尝试写入
1700451557
1700451558
if(offer(e))
1700451559
1700451560
return true;
1700451561
1700451562
else
1700451563
1700451564
//写入失败,队列已满
1700451565
1700451566
throw new IllegalStateException(“Queue full”);
1700451567
1700451568
}
1700451569
1700451570
public boolean offer(E e){
1700451571
1700451572
final ReentrantLock lock=this.lock;
1700451573
1700451574
//申请锁,只允许同时有一个线程操作
1700451575
1700451576
lock.lock();
1700451577
1700451578
try{
1700451579
1700451580
//元素计数器的计数与数组长度相同,表示队列已满
1700451581
1700451582
if(count==items.length)
1700451583
1700451584
return false;
1700451585
1700451586
else{//队列未满,插入元素
1700451587
1700451588
insert(e);
[
上一页 ]
[ :1.700451539e+09 ]
[
下一页 ]