1700451769
1700451770
1)10个线程都开始运行,执行到begin.await后线程阻塞,等待begin的计数变为0。
1700451771
1700451772
2)主线程调用begin的countDown方法,使begin的计数器为0。
1700451773
1700451774
3)10个线程继续运行。
1700451775
1700451776
4)主线程继续运行下一个语句,end的计数器不为0,主线程等待。
1700451777
1700451778
5)每个线程运行结束时把end的计数器减1,标志着本线程运行完毕。
1700451779
1700451780
6)10个线程全部结束,end计数器为0。
1700451781
1700451782
7)主线程继续执行,打印出成绩平均值。
1700451783
1700451784
CountDownLatch的作用是控制一个计数器,每个线程在运行完毕后会执行countDown,表示自己运行结束,这对于多个子任务的计算特别有效,比如一个异步任务需要拆分成10个子任务执行,主任务必须要知道子任务是否完成,所有子任务完成后才能进行合并计算,从而保证了一个主任务的逻辑正确性。这和我们的实际工作非常类似,比如领导安排了一个大任务给我,我一个人不可能完成,于是我把该任务分解给10个人做,在10个人全部完成后,我把这10个结果组合起来返回给领导—这就是CountDownLatch的作用。
1700451785
1700451786
1700451787
1700451788
1700451790
编写高质量代码:改善Java程序的151个建议 建议131:CyclicBarrier让多线程齐步走
1700451791
1700451792
思考这样一个案例:两个工人从两端挖掘隧道,各自独立奋战,中间不沟通,如果两人在汇合点处碰头了,则表明隧道已经挖通。这描绘的也是在多线程编程中,两个线程独立运行,在没有线程间通信的情况下,如何解决两个线程汇集在同一原点的问题。Java提供了CyclicBarrier(关卡,也有翻译为栅栏)工具类来实现,代码如下:
1700451793
1700451794
static class Worker implements Runnable{
1700451795
1700451796
//关卡
1700451797
1700451798
private CyclicBarrier cb;
1700451799
1700451800
public Worker(CyclicBarrier_cb){
1700451801
1700451802
cb=_cb;
1700451803
1700451804
}
1700451805
1700451806
public void run(){
1700451807
1700451808
try{
1700451809
1700451810
Thread.sleep(new Random().nextInt(1000));
1700451811
1700451812
System.out.println(Thread.currentThread().getName()+”-到达汇合点”);
1700451813
1700451814
//到达汇合点
1700451815
1700451816
cb.await();
1700451817
1700451818
}catch(Exception e){
[
上一页 ]
[ :1.700451769e+09 ]
[
下一页 ]