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
1700451668
编写高质量代码:改善Java程序的151个建议 建议130:使用CountDownLatch协调子线程
1700451669
1700451670
思考这样一个案例:百米赛跑,多个参加赛跑的人员在听到发令枪响后,开始跑步,到达终点后结束计时,然后统计平均成绩。这里有两点需要考虑:一是发令枪响,这是所有跑步者(线程)接收到的出发信号,此处涉及裁判(主线程)如何通知跑步者(子线程)的问题;二是如何获知所有的跑步者完成了赛跑,也就是主线程如何知道子线程已经全部完成,这有很多种实现方式,此处我们使用CountDownLatch工具类来实现,代码如下:
1700451671
1700451672
static class Runner implements Callable<Integer>{
1700451673
1700451674
//开始信号
1700451675
1700451676
private CountDownLatch begin;
1700451677
1700451678
//结束信号
1700451679
1700451680
private CountDownLatch end;
[
上一页 ]
[ :1.700451631e+09 ]
[
下一页 ]