1700451831
1700451832
CyclicBarrier cb=new CyclicBarrier(2,new Runnable(){
1700451833
1700451834
public void run(){
1700451835
1700451836
System.out.println(“隧道已经打通!”);
1700451837
1700451838
}
1700451839
1700451840
});
1700451841
1700451842
//工人1挖隧道
1700451843
1700451844
new Thread(new Worker(cb),“工人1”).start();
1700451845
1700451846
//工人2挖隧道
1700451847
1700451848
new Thread(new Worker(cb),“工人2”).start();
1700451849
1700451850
}
1700451851
1700451852
在这段程序中,定义了一个需要等待2个线程汇集的CyclicBarrier关卡,并且定义了完成汇集后的任务(输出“隧道已经打通!”),然后启动了2个线程(也就是2个工人)开始执行任务。代码逻辑如下:
1700451853
1700451854
1)2个线程同时开始运行,实现不同的任务,执行时间不同。
1700451855
1700451856
2)“工人1”线程首先到达汇合点(也就是cb.await语句),转变为等待状态。
1700451857
1700451858
3)“工人2”线程到达汇合点,满足预先的关卡条件(2个线程到达关卡),继续执行。此时还会额外的执行两个动作:执行关卡任务(也就是run方法)和唤醒“工人1”线程。
1700451859
1700451860
4)“工人1”线程继续执行。
1700451861
1700451862
CyclicBarrier关卡可以让所有线程全部处于等待状态(阻塞),然后在满足条件的情况下继续执行,这就好比是一条起跑线,不管是如何到达起跑线的,只要到达这条起跑线就必须等待其他人员,待人员到齐后再各奔东西,CyclicBarrier关注的是汇合点的信息,而不在乎之前或之后做何处理。
1700451863
1700451864
CyclicBarrier可以用在系统的性能测试中,例如我们编写了一个核心算法,但不能确定其可靠性和效率如何,我们就可以让N个线程汇集到测试原点上,然后“一声令下”,所有的线程都引用该算法,即可观察出算法是否有缺陷。
1700451865
1700451866
1700451867
1700451868
1700451870
编写高质量代码:改善Java程序的151个建议 第10章 性能和效率
1700451871
1700451872
快,快点,再快点……大脑已经跟不上鼠标!
1700451873
1700451874
——佚名
1700451875
1700451876
在这个快餐时代,系统一直在提速,从未停步过,从每秒百万条指令的CPU到现在的每秒万亿条指令的多核CPU,从最初发布一个帖子需要等待N小时才有回复到现在的微博,一个消息在几分钟内就可以传遍全球;从N天才能完成的一次转账交易,到现在的即时转账—我们进入了一个光速发展的时代,我们享受着,也在被追逐着—榨干硬件资源,加速所有能加速的,提升所有能提升的。
1700451877
1700451878
1700451879
1700451880
[
上一页 ]
[ :1.700451831e+09 ]
[
下一页 ]