CountDownLatch 和 CyclicBarrier 的用法
阿新 • • 發佈:2019-12-31
CountDownLatch
作用:是一組執行緒等待其他的執行緒完成工作以後在執行,加強版join
await 用來等待,countDown 負責計數器的減一
public class UseCountDownLatch {
static CountDownLatch latch = new CountDownLatch(6);
/**
* 初始化執行緒(只有一步,有4個)
*/
private static class InitThread implements Runnable{
@Override
public void run() {
System.out.println("Thread_" + Thread.currentThread().getId() + " ready init work......");
//初始化執行緒完成工作了,countDown方法只扣減一次;
latch.countDown();
for(int i =0;i<2;i++) {
System.out.println("Thread_"+Thread.currentThread().getId() +" ........continue do its work" );
}
}
}
//業務執行緒
private static class BusiThread implements Runnable{
@Override
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i =0;i<3;i++) {
System.out.println("BusiThread_" +Thread.currentThread().getId()
+" do business-----");
}
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new BusiThread()).start();
for(int i=0;i<=3;i++){
Thread thread = new Thread(new InitThread());
thread.start();
}
latch.await();
System.out.println("Main done its work........");
}
}
複製程式碼
CyclicBarrier
讓一組執行緒達到某個屏障,被阻塞,一直到組內最後一個執行緒達到屏障時,屏障開放,所有被阻塞的執行緒會繼續執行
CyclicBarrier(int parties) CyclicBarrier(int parties,Runnable barrierAction),屏障開放,barrierAction 定義的任務會執行
public class UseCyclicBarrier {
private static CyclicBarrier barrier = new CyclicBarrier(5,new CollectThread());
/**
* 存放子執行緒工作結果的容器
*/
private static ConcurrentHashMap<String,Long> resultMap = new ConcurrentHashMap<>();
public static void main(String[] args) {
for(int i=0;i<=4;i++){
Thread thread = new Thread(new SubThread());
thread.start();
}
}
/**
* 負責屏障開放以後的工作
*/
private static class CollectThread implements Runnable{
@Override
public void run() {
StringBuilder result = new StringBuilder();
for(Map.Entry<String,Long> workResult:resultMap.entrySet()){
result.append("[").append(workResult.getValue()).append("]");
}
System.out.println(" the result = "+ result);
System.out.println("do other business........");
}
}
/**
* 工作執行緒
*/
private static class SubThread implements Runnable{
@Override
public void run() {
long id = Thread.currentThread().getId();
resultMap.put(Thread.currentThread().getId() + "",id);
//隨機決定工作執行緒的是否睡眠
Random r = new Random();
try {
if(r.nextBoolean()) {
Thread.sleep(2000+id);
System.out.println("Thread_"+id+" ....do something ");
}
System.out.println(id+"....is await");
barrier.await();
Thread.sleep(1000+id);
System.out.println("Thread_"+id+" ....do its business ");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
複製程式碼
CountDownLatch和CyclicBarrier辨析
- countdownlatch放行由第三者控制,CyclicBarrier放行由一組執行緒本身控制
- countdownlatch放行條件》=執行緒數,CyclicBarrier放行條件=執行緒數