百米赛跑中,多名参赛选手听到号炮声后开始跑,到达终点时结束时间,统计各选手的成绩。 这是线程中必须考虑的两点。 第一,枪响了,这是所有的跑步者(线程)接收到的出发信号,这里关系到裁判员(主线程)如何通知跑步者(子线程)的问题。第二,所有的跑步者完成赛跑,即主线程如何辅助 这是通过CountDownLatch工具类实现的。 更具体地说,请参见以下代码
赛跑运动员
运动会开始!
平均成绩
CountDownLatch类是倒数同步计数器,在程序中启动了两个计数器。 一个是开始计数器begin,指令枪,还有结束计数器,这里有10个,指示每个线程的执行情况,即跑步者是否结束了比赛。 程序逻辑如下:
10所有线程都开始运行,直到运行begin.await ( )时线程被阻止,并等待begin计数为0
主线程调用begin的CountDown方法是begin的计数器为0
10继续执行线程
主线程继续执行以下语句,end计数器不是0,主线程等待
每个线程的执行结束时,将end的计数器减少1个,表示本线程的执行结束。
10线程全部结束,end计数器为0
主线程将继续运行,并打印成绩的平均值
CountDownLatch的角色通过控制一个计数器,指示每个线程在执行完成后运行CountDown,并且自己的执行完成。 这对多个子任务的计算特别有效,例如,异步任务需要分割成10个子任务来执行,主任务需要知道子任务是否完成,在所有子任务完成之后可以进行合并计算,保证1、2主任务的逻辑的正确性 这就是CountDownLatch的作用。
非常感谢你