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;
1700451619
1700451620
//可中断锁
1700451621
1700451622
lock.lockInterruptibly();
1700451623
1700451624
try{
1700451625
1700451626
try{
1700451627
1700451628
//队列满,等待其他线程移除元素
1700451629
1700451630
while(count==items.length)
1700451631
1700451632
notFull.await();
1700451633
1700451634
}catch(InterruptedException ie){
1700451635
1700451636
//被中断了,唤醒其他线程
1700451637
1700451638
notFull.signal();
1700451639
1700451640
throw ie;
1700451641
1700451642
}
1700451643
1700451644
//插入元素
1700451645
1700451646
insert(e);
1700451647
1700451648
}finally{
1700451649
1700451650
//释放锁
1700451651
1700451652
lock.unlock();
1700451653
1700451654
}
1700451655
1700451656
}
1700451657
1700451658
put方法的目的就是确保元素肯定会加入到队列中,问题是此种等待是一个循环,会不停地消耗系统资源,当等待加入的元素数量较多时势必会对系统性能产生影响,那该如何解决呢?JDK已经想到了这个问题,它提供了带有超时时间的offer方法,其实现方法与put比较类似,只是使用Condition的awaitNanos方法来判断当前线程已经等待了多少纳秒,超时则返回false。
[
上一页 ]
[ :1.700451609e+09 ]
[
下一页 ]