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);
1700451589
1700451590
return true;
1700451591
1700451592
}
1700451593
1700451594
}finally{
1700451595
1700451596
//释放锁
1700451597
1700451598
lock.unlock();
1700451599
1700451600
}
1700451601
1700451602
}
1700451603
1700451604
}
1700451605
1700451606
上面在加入元素时,如果判断出当前队列已满,则返回false,表示插入失败,之后再包装成队列满异常。此处需要注意offer方法,如果我们直接调用offer方法插入元素,在超出容量的情况下,它除了返回false外,不会提供任何其他信息,如果我们的代码不做插入判断,那就会造成数据的“默默”丢失,这就是它与非阻塞队列的不同之处。
1700451607
1700451608
阻塞队列的这种机制对异步计算是非常有帮助的,例如我们定义深度为100的阻塞队列容纳100个任务,多个线程从该队列中获取任务并处理,当所有的线程都在繁忙,并且队列中任务数量已经为100时,也预示着系统运算压力非常巨大,而且处理结果的时间也会比较长,于是在第101个任务期望加入时,队列拒绝加入,而且返回异常,由系统自行处理,避免了异步运算的不可知性。但是如果应用期望无论等待多长时间都要运行该任务,不希望返回异常,那该怎么处理呢?
1700451609
1700451610
此时就需要用BlockingQueue接口定义的put方法了,它的作用也是把元素加入到队列中,但它与add、offer方法不同,它会等待队列空出元素,再让自己加入进去,通俗地讲,put方法提供的是一种“无赖”式的插入,无论等待多长时间都要把该元素插入到队列中,它的实现代码如下:
1700451611
1700451612
public void put(E e)throws InterruptedException{
1700451613
1700451614
//容纳元素的数组
1700451615
1700451616
final E[]items=this.items;
1700451617
1700451618
final ReentrantLock lock=this.lock;
[
上一页 ]
[ :1.700451569e+09 ]
[
下一页 ]