这次介绍的是JAVA并发容器中的俩个常见容器:CountDownLatch与CyclicBarrier
CountDownLatch (闭锁)
听听这个名字,直白的翻译就是倒计时锁,功能也差不多,下面我白话介绍一下:
裁判在主持比赛通常都倒计时一下,3,2,1跑!然后几个运动员听到0的瞬间猛的跑出去。
CountDownLatch 的countDown方法执行一次就回在数量上减一,减到零的时候就会在当前这个锁阻塞的地方(此处就是await方法处)继续执行。
代码示例如下:
package com.healist.coder;
import java.util.concurrent.CountDownLatch;
/**
* @Author healist
* @Description
* @Create 2018-02-22 下午4:45
*/
public class CountDownBarrier {
public static void main(String[] args) {
int num = 5;
CountDownLatch start = new CountDownLatch(1);
CountDownLatch end = new CountDownLatch(5);
for(int i=0; i<num; i++) {
new Thread(new Sporter("Sporter"+i, start, end)).start();
}
//裁判喊到0开始比赛
start.countDown();
long startTime = System.currentTimeMillis();
try {
//等待运动员全部跑完
end.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
long endTime = System.currentTimeMillis();
System.out.println("All Arrived!!!");
System.out.println("Cost Time:" + (endTime-startTime));
}
}
static class Sporter implements Runnable{
private String name;
private CountDownLatch start;
private CountDownLatch end;
public Sporter(String name, CountDownLatch start, CountDownLatch end) {
this.name = name;
this.start = start;
this.end = end;
}
public void run() {
try {
//裁判喊0开始跑的时候在此
start.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(this.name + "arrived");
end.countDown();
}
}
}
}
运行结果:
Sporter4arrived
Sporter0arrived
Sporter1arrived
Sporter2arrived
Sporter3arrived
All Arrived!!!
Cost Time:2
CyclicBarrier(栅栏)
循环栅栏,其实等大家都集合完毕再去做其他事,这里还拿运动员跑步为例,假如5个运动员跑到终点后,大家就集合去网吧去吃鸡!
代码示例:
package com.healist.coder;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* @Author healist
* @Description
* @Create 2018-02-22 下午5:56
*/
public class CyclicBarrierLearn {
public static void main(String[] args) {
int num = 5;
CyclicBarrier cyclicBarrier = new CyclicBarrier(num, new Runnable() {
public void run() {
System.out.println("集合完毕,吃鸡大吉!");
}
});
for(int i=0; i<num; i++) {
new Thread(new Sporter("Sporter"+i, cyclicBarrier)).start();
}
}
static class Sporter implements Runnable{
private String name;
private CyclicBarrier barrier;
public Sporter(String name, CyclicBarrier barrier) {
this.name = name;
this.barrier = barrier;
}
public void run() {
try {
System.out.println(this.name+":start to run");
Thread.sleep(1000);
System.out.println(this.name+":arrived!");
this.barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
运行结果:
Sporter0:start to run
Sporter1:start to run
Sporter2:start to run
Sporter3:start to run
Sporter4:start to run
Sporter0:arrived!
Sporter3:arrived!
Sporter2:arrived!
Sporter1:arrived!
Sporter4:arrived!
集合完毕,吃鸡大吉!