CountDownLatch,CyclicBarrier,Semaphore案例学习

/**
 * @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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值