当前位置: 首页 > news >正文

线程同步辅助类的使用

一、countDownLatch(减法)

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {


        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"OUT_OF");
                countDownLatch.countDown();
            }).start();
        }
        countDownLatch.await();
        System.out.println("Close Door");
    }
}

1、可以理解成countDown()一次就减一 直到0结束

2、countDownLatch.await();可以设置超时时间 如:

countDownLatch.await(8, TimeUnit.SECONDS);

超时会抛出异常

二、CyclicBarrier(加法)

public class CyclicBarrierDemo {
    public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
        //设置阻碍 达到数量 执行
        CyclicBarrier c = new CyclicBarrier(7, () -> {
            System.out.println("召唤神龙成功");
        });
        for (int i = 0; i < 3; i++) {
            final int temp=i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"-----------------"+"收集第"+temp+"龙珠");
                try {
                    c.await(4, TimeUnit.SECONDS);
                } catch (InterruptedException e) {
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                ;
                System.out.println("第"+temp+"龙珠");
            }).start();
        }
    }
}

1、调用一次await() 就加1 到达指定数量结束

2、c.await();也可以设置超时时间

三、Semaphore

public class SemaphoreDemo {
    public static void main(String[] args) {
        //线程数量
        Semaphore semaphore = new Semaphore(3);
        for (int s = 0; s < 6; s++) {
            final int temp=s;
            new Thread(()->{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"获取第"+temp+"停车位");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName()+"释放第"+temp+"停车位");
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } finally {
                    semaphore.release();
                }
            },String.valueOf(s)).start();
        }

    }
}

1、必须使用semaphore.acquire(); 否则线程数量不会被限制 和普通线程一样

2、如果不执行semaphore.release(); 线程永远占用一个数量

3、最多指定数量的线程 执行完释放后 进入新的线程

和线程池区别:

线程池是线程不变 这里是位置不变 线程改变

相关文章:

  • 4.3MISC流量分析练习-wireshark-https
  • 内网渗透测试-Vulnerable Docker靶场
  • 深入探究OPA1612AIDR:性能剖析、引脚功能、应用实例与注意事项
  • 如何让别人的电脑蓝屏?(没有任何实质性损害,重启后仍然能正常运行;可恶搞)
  • 向量数据库milvus部署
  • Baklib驱动内容中台智能推荐优化
  • 《深度剖析:生成对抗网络中生成器与判别器的高效协作之道》
  • 华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径
  • 两种常见视频传输线材
  • 如何防止 Instagram 账号被盗用:安全设置与注意事项
  • 学习threejs,Materials常量汇总
  • Linux中Shell运行原理和权限(下)(4)
  • 玄机-第六章 流量特征分析-蚁剑流量分析
  • 软件工程应试复习(考试折磨版)
  • C语言机试编程题
  • 宋朝七律代表作20首
  • 用于训练基于pytorch构建的小型字符级语言模型的数据集汇总
  • 项目实践 之 pdf简历的解析和填充(若依+vue3)
  • 清华大学出品《DeepSeek 从入门到精通》完整版手册下载和使用教程。
  • 网络安全词汇
  • 2025年度上海市住房城乡建设管理委工程系列中级职称评审工作启动
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • 美联储主席:关税“远超预期”,美联储实现目标的进程或被推迟至明年
  • 关税风暴下,3G资本拟94亿美元私有化美国鞋履巨头斯凯奇,溢价30%
  • 为什么所有动物里,只有人类幼崽发育得这么慢?
  • 跳水世界杯总决赛陈佳获得女子3米板冠军,陈艺文获得亚军