JUC练习9——计数器
1,CountdownLatch适用于所有线程执行结束后了(指定的事件都发生了),放开封锁,目标事件(线程)执行。例如:我制作一个汽车,每个零件的制作是一个进程,组装是一个进程,需要等到所有的零件制作进程执行结束,才会触发将汽车组装进程。
而CyclicBarrier则适合让所有线程在同一点同时执行,例如:运动员需要都集合准备好,才能开跑,开跑后,所有的运动员一起跑步
2,CountdownLatch利用继承AQS的共享锁来进行线程的通知,利用CAS来进行--,而CyclicBarrier则利用ReentrantLock的Condition来阻塞和通知线程
示例代码
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
public class JucTest9
{
public static void main(String[] args) throws Exception
{
//cyclicBarrierTest();
countDownLatchTest();
}
static void cyclicBarrierTest()throws Exception
{
CyclicBarrier cyclicBarrier = new CyclicBarrier(4,()->{
System.out.println("4人组集合完毕,开枪");
});
for(int i=1;i<=4;i++){
new Thread(()->
{
System.out.println(Thread.currentThread().getName()+"到队集合,等待跑步出发");
try
{
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName()+"跑步");
}catch (Exception e)
{
e.printStackTrace();
}
},"A"+i).start();
}
}
static void countDownLatchTest() throws Exception
{
//指定一个数值进行是、计数,使用await()进行等待计算器归零后,继续向下执行
CountDownLatch countDownLatch = new CountDownLatch(4);
for(int i=1;i<=4;i++){
new Thread(()->
{
System.out.println(Thread.currentThread().getName()+"汽车零件开始准备");
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName()+"汽车零件准备完成");
},"A"+i).start();
}
countDownLatch.await();
System.out.println("汽车进行组装");
}
}