/**
* @ClassName CountDownLatchDemo
* @Description CountDownLatch
*
* 让一些线程阻塞直到另一些线程完成一系列方法之后才被唤醒
* CountDownLatch有两个主要方法 线程调用await方法会导致阻塞直到别的线程调用countDown的过程中 CountDownLatch的count为0
**/
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
CountryEnum.countryEnumMapCreat();
for(int i = 1; i <= 6; i++){
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t" + "国,被灭");
countDownLatch.countDown();
},CountryEnum.countryEnumMap.getOrDefault(i,CountryEnum.OTHER).getMsg()).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "\t" + "秦朝统一!");
}
public static void closeDoor() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for(int i = 1; i <= 6; i++){
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t" + "上完自习离开教室");
countDownLatch.countDown();
},String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "\t" + "班长最后关门走人");
}
}
@Getter
enum CountryEnum{
ONE(1,"齐"),TWO(2,"楚"),THREE(3,"燕"),FOUR(4,"赵"),FIVE(5,"魏"),SIX(6,"韩"),OTHER(0,"异常");
private Integer code;
private String msg;
CountryEnum(Integer code, String msg){
this.code = code;
this.msg = msg;
}
public static Map<Integer,CountryEnum> countryEnumMap = Maps.newHashMap();
public static void countryEnumMapCreat(){
countryEnumMap = Arrays.stream(CountryEnum.values()).collect(Collectors.toMap(CountryEnum :: getCode, n->n,(k1,k2)->k1));
}
}
**
* @ClassName CyclicBarrierDemo
* @Description CyclicBarrier
* @Author WangJun
* @Date 2020/7/16 16:32
*
* 类似 countDownLatch , CyclicBarrier定义一个数字i和线程A,等到await的线程数达到i后 才执行A
**/
public class CyclicBarrierDemo {
public static CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()-> System.out.println("预备! 跑!"));
public static void main(String[] args) {
for(int i = 1; i <= 7; i++){
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
/**
* @ClassName SemaphoreDemo
* @Description Semaphore
*
* 信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个是用于并发线程数的控制
**/
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);//模拟三个停车位
for (int i = 1; i <= 6; i++) {
new Thread(()->{
try {
//占用
semaphore.acquire();
System.out.println(Thread.currentThread().getName() +"\t 抢到车位");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() +"\t 停车三秒后离开车位");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//释放
semaphore.release();
}
},i+"").start();
}
}
}