控制并发流程是指让各个线程之间互相协调,具体说就是一个线程等到其它事件或线程运行完毕达到要求。

一:CountDownLach 类 使用场景:一个线程等待其他一个或多个线程执行完后再继续它的操作

例如:举个例子,有三个工人在为老板干活,这个老板有一个习惯,就是当三个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:三个工人先全部干完活,老板才检查

常用方法:

1.countDown 工人干完了调用这个方法

2.await 老板分完活后,在等待检查,当CountDownLatch的值为0时,则老板开始检查

二:Semaphore 使用场景:用于做限流处理,比如说同时只允许5五个人访问,超过五个人访问就需要等待,类似这样的需求,下面的案例可以看出执行是五个五个的执行,等上一个五个执行完了,才会执行下一个

常用方法:

1.acquire();获取许可

2.semp.release();访问完后,释放

三:Condition 使用场景:当线程1需要等待某个条件的时候,它就去执行condition.await()方法,一旦执行了await()方法,线程就会进入阻塞状态。然后通常会有另外一个线程,假如是线程2吗,去执行对应的条件,知道这个条件达成的时候,线程2就会去执行condition.signal()方法,这时jvm就会从阻塞的线程里找,找到那些等待该condition的线程,当线程1就会收到可执行信号的时候,它的线程状态就会变成Runnable可执行状态

常用方法:

1.await 等待

2.signal 唤醒 (signal是公平的,如果有多个线程等待,只会唤醒等待时间最长的线程)

3.signalAll 会唤起所有正在等待的线程

四:CycliBarrier 使用场景:5个人约玩,所有人都到场了,大家统一出发

常用方法:

1.await 等待

与CountDownLatch区别

1.作用不同:CycliBarrier要等固定数量的线程都到达了栅栏位置才能继续执行,而CountDownLatch只需等到数字是0,也就是说,CountDownLatdch用于事件,CycliBarrier用于线程

2.可重用性不同:CountDownLatch在倒数到0并触发门闩打开后,就不能再次使用了,除非新建新的实例;而CycliBarrier可以重复使用

五:总结

1.相互等待,使用CountDownLatch

2,控制并发总量,使用Semaphore