Java_JUC_CountDownLatch/CyclicBarrier循环屏障/Semaphore信号灯/枚举

Java_JUC_CountDownLatch/CyclicBarrier循环屏障/Semaphore信号灯/枚举

java常用的juc api

(一)枚举

1.1 代码实现

package jucapi;

import lombok.Getter;

/**
 * 枚举 就是一张数据库的表
 * 用了枚举可以降低程序的耦合度
 *
 * 主要是给CountDownLatchDemo用的
 */

public enum CountryEnum{
    ONE(1,"齐"), TWO(2,"楚"), THREE(3,"燕"), FOUR(4,"赵"), FIVE(5,"魏"), SIX(6,"韩");

    @Getter private Integer retCode;   //1
    @Getter private String retMessage; //齐
    @Getter private String retMessage2;

    CountryEnum(Integer retCode, String retMessage) {
        this.retCode = retCode;
        this.retMessage = retMessage;
    }


    /**
     * CountDownLatchDemo 调用的方法
     * @param index 1
     * @return 齐
     */
    public static CountryEnum forEach_CountryEnum(int index){
        //变数组
        CountryEnum[] myArray = CountryEnum.values();
        //增强for循环
        //如果CountDownLatchDemo传过来的index是1,那么我返回“齐”
        for(CountryEnum element:myArray){
            if(index == element.getRetCode()){
                return element;
            }
        }
        return null;
    }


    /**
     * get set
     * @return
     */
    public Integer getRetCode() {
        return retCode;
    }

    public void setRetCode(Integer retCode) {
        this.retCode = retCode;
    }

    public String getRetMessage() {
        return retMessage;
    }

    public void setRetMessage(String retMessage) {
        this.retMessage = retMessage;
    }

}

/**
 mysql daNmae = CountryEnum

 table
 one
 ID userName age birth userEmail
 1  齐       109

   ONE(1,"齐",v2,v3,v4,v5)
 */




(二)CountDownLatch

2.1 什么是CountDownLatch?

让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。

2.2 方法

  • //大招step1
    CountDownLatch countDownLatch = new CountDownLatch(6);
  • //大招step2
    countDownLatch.countDown();
  • //大招step3
    countDownLatch.await();

一个或多个调用await方法的线程会被阻塞,

其它线程调用countDown方法会将计数器减1(该线程不会阻塞),

当计数器的值变为0时,因调用await方法被阻塞的线程会被唤醒,继续执行。

2.3 代码实现

package jucapi;

import java.util.concurrent.CountDownLatch;

/**
 * java 常用的JUC api
 * CountDownLatch
 
 先看 closeDoor()
 *
 * 用了枚举可以降低程序的耦合度
 *
 * 需要用到自写的一个枚举
 */
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {

        //大招step1
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for(int i=1;i<=6;i++){
            //哪个线程用枚举
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + "\t国被灭");
                //大招step2 计数减1
                countDownLatch.countDown();
            },CountryEnum.forEach_CountryEnum(i).getRetMessage()).start();  //线程名字调用了枚举
        }

        //大招step3
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+"\t--------秦,一统华夏");
        System.out.println(CountryEnum.ONE);
        System.out.println(CountryEnum.ONE.getRetCode());
        System.out.println(CountryEnum.ONE.getRetMessage());

    }


    /**
     * CountDownLatch
     * 用于理解的最简单的例子
     * @throws InterruptedException
     */
    public static void closeDoor() throws InterruptedException {
        //大招step1
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for(int i=1;i<=6;i++){
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"\t上完晚自习,走人");
                //大招step2
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        //大招step3
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+"\t班长关门走人");
    }


}

/*
赵	国被灭
韩	国被灭
燕	国被灭
魏	国被灭
齐	国被灭
楚	国被灭
main	--------秦,一统天下
ONE
1
齐

 */

(三)CyclicBarrier循环屏障

3.1 什么是CyclicBarrier?

做加法:集齐七龙珠,才能召唤神龙。

3.2 方法

  • //大招step1
    CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{ System.out.println(“***********召唤神龙”); });

  • //大招step2 先来的等待

​ cyclicBarrier.await();

3.3 代码实现

package jucapi;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * CyclicBarrier
 * 翻译:循环屏障
 *
 * 集齐七龙珠,才能召唤神龙
 * 先到的线程,先等着
 */

public class CyclicBarrierDemo {
    public static void main(String[] args) {

        //大招step1
        //CyclicBarrier(int parties, Runnable barrierAction)
        //注 Runnable接口的最好用lambda表达式
        CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{ System.out.println("***********召唤神龙"); }); //必须要有接收

        for(int i=1;i<=7;i++) {
            final int tempInt = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName()+"\t收到第:"+tempInt+"颗龙珠");

                //大招step2 先来的等待
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }

            },String.valueOf(i)).start();
        }

    }

}

/*
1	收到第:1颗龙珠
5	收到第:5颗龙珠
3	收到第:3颗龙珠
6	收到第:6颗龙珠
7	收到第:7颗龙珠
2	收到第:2颗龙珠
4	收到第:4颗龙珠
***********召唤神龙
 */

(四)Semaphore信号灯

4.1 什么是Semaphore?

6辆车枪3个车位,直到6辆车都停过3秒为止,多个线程抢占多份资源

4.2 方法

  • //大招step1 模拟三个车位
    Semaphore semaphore = new Semaphore(3);

  • //大招step2 线程去获得车位
    semaphore.acquire();

  • //大招step3 线程3后去释放车位
    semaphore.release();

4.3 代码实现

package jucapi;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * SemaphoreDemo 信号灯
 * 解释:6辆车枪3个车位,直到6辆车都停过3秒为止,多个线程抢占多份资源
 *
 * 有减有增,有增有减
 *
 * 用好了完全可以代替synchronize锁等
 *
 */
public class SemaphoreDemo {
    public static void main(String[] args) {
        //大招step1 模拟三个车位
        Semaphore semaphore = new Semaphore(3);

        for(int i=1;i<=6;i++) {
            new Thread(() -> {
                try {
                    //大招step2 线程去获得车位
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"\t获得车位");
                    //休眠3秒
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName()+"\t停车3秒后离开车位");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //大招step3 线程去释放车位
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }
    }


}

/*
1	获得车位
5	获得车位
2	获得车位
5	停车3秒后离开车位
1	停车3秒后离开车位
6	获得车位
2	停车3秒后离开车位
3	获得车位
4	获得车位
4	停车3秒后离开车位
3	停车3秒后离开车位
6	停车3秒后离开车位
 */

如果你发现 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值