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#
全部评论

相关推荐

01-27 15:41
门头沟学院 Java
想躺平的菜鸡1枚:我项目比你难、学历比你好、还有SCI论文,投java都被拒一大片,现在基本上都要问点agent开发
软件开发投递记录
点赞 评论 收藏
分享
行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务