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。
1700451659
1700451660
与插入元素相对应,取出元素也有不同的实现,例如remove、poll、take等方法,对于此类方法的理解要建立在阻塞队列的长度固定的基础上,然后根据是否阻塞、阻塞是否超时等实际情况选用不同的插入和提取方法。
1700451661
1700451662
注意 阻塞队列的长度是固定的。
1700451663
1700451664
1700451665
1700451666
[
上一页 ]
[ :1.700451617e+09 ]
[
下一页 ]