JUC-常用工具类使用

Semaphore 信号量

构造方法参数,指定信号量资源的总数

acquire方法,获得1个信号量资源,如果信号量满了,需要等待资源释放

release方法,释放1个信号量资源,然后通知其他等待的线程

常用于多个线程对同一个共享资源的互斥处理,可以做流量限流

代码示例:

6辆车,3个车位,抢车位

public class SemaphoreTest {

    public static void main(String[] args) {
        /**
         * 6辆车,3个停车位
          */
        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i <= 6 ; i++) {
            new Thread(()->{
                try {
                    // 获得停车位
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "号车获得停车位");
                    // 线程睡一秒
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(Thread.currentThread().getName() + "号车离开停车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 释放资源
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }
    }
}

CountDownLatch减法计数器

构造方法,指定计数器初始容量

countDown()方法,计数器容量减1

await()方法,等待技术器值归零,计数器归零之后,才能执行该代码后面的代码

public class CountDownLatchTest {

    public static void main(String[] args) throws InterruptedException {
        // 减法计数器,参数是int类型
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for (int i = 1; i <= 6; i++) {
            new Thread(()-> {
                // 计数器执行减一操作
                System.out.println(Thread.currentThread().getName() + " go out");
                countDownLatch.countDown();
            }, String.valueOf(i)).start();
        }

        // 等待计数器归零,才能执行下面的代码
        countDownLatch.await();

        System.out.println("close door");
    }
}

CyclicBarrier加法计数器

构造方法,参数1指定需要达到的线程数量,参数二,Runnable接口实现类,如果达到了要求数量会执行Runnable接口中的run方法

await()方法,等待线程数量达到指定数量,达到之后,执行参数二中的业务

代码实现:

集齐七颗龙珠,召唤神龙

public class CyclicBarrierTest {

    public static void main(String[] args) {
        // 两个参数,参数1,指定需要达到线程数量,参数2,线程数量达到后,执行Runnable中的run方法
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{
            System.out.println("集齐七颗龙珠,召唤神龙");
        });

        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(()-> {
                System.out.println("集齐第一颗龙珠" + temp);
                try {
                    // 等到cyclicBarrier指定的线程数量达到7,就执行cyclicBarrier中指定写好的线程逻辑
                    cyclicBarrier.await();
                    System.out.println("没到7不会执行这里的代码");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

#JUC#
全部评论

相关推荐

10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务