首页 > 其他分享 >JUC的强大辅助类

JUC的强大辅助类

时间:2023-11-22 23:24:27浏览次数:31  
标签:JUC 辅助 Thread getName 强大 System 线程 println out

JUC的强大辅助类

juc中提供了常用的辅助类,通过这些辅助类,可以很好的解决线程数量过多时,Lock锁的频繁操作这三种辅助类为:

  • 1.CountDownLatch,减少计数。
  • 2.CyclicBarrier,循环栅栏。
  • 3.Semaphore,信号灯。

减少计数器(CountDownLatch)

CountDownLatch类可以设置一个计数器,然后通过countDown方法来进行-1操作,使用await方法等待计数器的值<=0,然后继续执行await方法之后的语句。

  • 1.CountDownLatch,有两个主要方法是await()和countDown(),当一个或多个线程调用await()时,这些线程会阻塞。
  • 2.线程调用countDown()时,计数器的值会-1(调用countDown()方法不会阻塞)。
  • 3.当计数器的值变为0时,因计数器.await(),阻塞的线程,会被唤醒继续执行。
案例及代码实现
/**
 * @author 长名06
 * @version 1.0
 * 演示CountDownLatch
 */
public class CountDownLatchDemo {
    //6位同学,陆续离开教室后,班长才锁门
    public static void main(String[] args) throws InterruptedException {
//  此代码不能实现案例要求,因为mian线程和新增的线程间不是互斥状态,并行执行,
//  很可能班长已经锁门,但是还有同学未离开教室
//        for (int i = 0; i < 6; i++) {
//            new Thread(() ->{
//                System.out.println(Thread.currentThread().getName() + "位同学离开教室");
//            },String.valueOf(i + 1)).start();
//        }
//        System.out.println(Thread.currentThread().getName() + "班长锁门了");
        //第一步,创建计数器,定义初始值
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 0; i < 6; i++) {
            new Thread(() ->{
                //需要执行的代码,一定要写在进行-1操作前,因为计数器的值一旦变为0,就会立刻唤醒,因其await()等待的线程,
                //写在之后的话,可能就会出现,主线程执行,其他线程才执行的情况
                //第二步,执行线程需要的操作
                System.out.println(Thread.currentThread().getName() + "位同学离开教室");
                //第三步,进行-1操作
                countDownLatch.countDown();//对设定的初始值,进行-1操作
            },String.valueOf(i + 1)).start();
        }
        //第四步,使其他线程等待
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName() + "班长锁门了");
    }
}

循环栅栏(CyclicBarrier)

CyclicBarrier是循环阻塞的意思,在使用中,Cyclic构造方法,第一个参数是目标数,每次执行CyclicBarrier一次,目标数会+1,只有达到了目标数,才会执行,传入的第二个参数barrierAction 中的run方法。可以将CyclicBarrier.await()看作一次目标数+1并且阻塞当前线程的复合操作,且该阻塞方法,是在目标数达成后,统一唤醒因该方法阻塞的线程,继续执行执行每个线程的操作。

案例及代码实现
/**
 * @author 长名06
 * @version 1.0
 * 演示循环栅栏CyclicBarrier
 * 集齐七颗龙珠案例
 */
public class CyclicBarrierDemo {

    //集齐七颗龙珠
    private static final int NUMBER = 7;

    public static void main(String[] args) {
        //第一步,设定目标数,且指定目标数达成后,要执行的方法
        CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, () -> {
            System.out.println("七颗龙珠被集齐了");
        });

        for (int i = 1; i <= 7; i++) {
            new Thread(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "星龙珠被收集到了");
                    //第二步+1,且阻塞线程
                    cyclicBarrier.await();
                    System.out.println(Thread.currentThread().getName() +"测试");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }
    }
}

信号灯(Semaphore)

Semaphore的构造方法,中传入的第一个参数是最大信号量(可以看作线程池中的最大线程数),每个信号量初始化的数目,也就是能分发的最大许可证,使用acquire()方法,获取许可证,release()方法释放许可证。

案例及代码实现
/**
 * @author 长名06
 * @version 1.0
 * 信号灯 信号量
 */
public class SemaphoreDemo {
    //实现6辆车,停入3个车位
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore( 3);

        for (int i = 1; i < 7; i++) {
            new Thread(() -> {
                try {
//                    System.out.println(Thread.currentThread().getName() + "号车寻找车位中");
                    semaphore.acquire();//获取信号量
                    System.out.println(Thread.currentThread().getName() + "号车,停车成功");
                    TimeUnit.SECONDS.sleep(new Random().nextInt(5));//随机等待几秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    System.out.println(Thread.currentThread().getName() + "号车,离开驶出车位");
                    semaphore.release();//释放信号量操作
                }

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

    }
}

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:JUC,辅助,Thread,getName,强大,System,线程,println,out
From: https://www.cnblogs.com/changming06/p/17850555.html

相关文章

  • 29.8k star,推荐一个酷炫、强大的现代开源文件资源管理器
    先看张图,下载地址在文末:「Files」是一款为Windows设计的现代化文件管理器,它具有美观的界面、强大的功能和高效的操作。本文将介绍「Files」的基本信息、使用方法、特点和安装方式,并对其进行总结。「Files」简介「Files」是一个由社区驱动的开源项目,由数百名贡献者共同设计和......
  • 激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相
    激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相CogVLM是一个强大的开源视觉语言模型(VLM)。CogVLM-17B拥有100亿视觉参数和70亿语言参数。CogVLM-17B在10个经典跨模态基准测试上取得了SOTA性能,包括NoCaps、Flicker30kcaptioning、RefCOCO、RefCOCO+、RefCO......
  • 阿里云 ecs绑定辅助网卡,一个ECS服务器绑定多个IP ,用于centos,其他系统可以参考
    1、进入实例详情,选择网络与安全->弹性网卡  2、创建网卡3、然后创建好之后,绑定实例,我图1的是已经绑定好了的  4、进入弹性公网IP:https://vpc.console.aliyun.com/eip/ap-southeast-1/eips 5、购买ip,建议选择按量付费,没有带宽限制,购买完成后绑定刚刚创建的辅助......
  • 掌握迭代器:Python中的强大工具,让你轻松驾驭数据处理的巨轮
    今天,我们将深入探讨Python中的迭代器。迭代器是一种强大的工具,它使我们能够在不需要知道数据集的全部信息的情况下,逐个访问数据集中的每个元素。通过使用迭代器,我们可以逐个处理数据集中的每个元素,而不需要一次性加载整个数据集到内存中。这使得迭代器在处理大型数据集时特别有用。......
  • Warehouse:管理 Flatpak 应用的强大工具
    导读有一个应用,可以为你提供有关Flatpak应用的所有重要信息,以及管理它的工具,这不是很好吗?这一次你很幸运!在这次的首次尝试中,我们有一个有趣的应用程序,名为“Warehouse”,它可以帮助你管理Flatpak应用。我们以前介绍过一个类似的应用,名为“Flatseal”,但它更侧重于管......
  • 神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!-未来:复制粘贴工程师转向提示工程师
    在ChatGPT问世之前,我们的编码方式很多时候都是面向搜索引擎编码,需要不断地进行搜索,然后复制粘贴,俗称复制粘贴工程师。但是,随着ChatGPT的出现,这一切将彻底改变。ChatGPT是一种基于人工智能的自然语言处理模型,可以根据上下文理解人类语言并生成相应的回复。在编码方面,ChatGPT可......
  • 正则表达式工具:强大且高效的模式匹配利器
    https://www.cnblogs.com/Amd794/p/17813641.htmlhttps://amd794.com/regularGraph正则表达式,或称为regex,是一种强大的文本处理工具,它以特定的字符串模式匹配为基础,并有能力进行复杂的搜索、编辑和操作。尽管其语法可能初看起来复杂,但掌握正则表达式将使您能够以高效且准确的方......
  • Looker Studio | 带来强大的探索、更新鲜的数据和更快的过滤
    【信息来源:GoogleCloud 。CloudAce,GoogleCloud全球战略合作伙伴】 LookerStudio支持对临时数据进行自助分析,并与Looker一起为每月访问Looker系列产品的超过1000万用户做出贡献。今天,谷歌云为分析师推出新方法,为业务用户提供探索数据和自助业务决策的选项,扩展所......
  • CodeWhisperer--手把手教你使用一个十分强大的工具
    AmazonCodeWhisperer是一款能够帮助我们智能生成代码的工具。经过数十亿行代码的训练,可以根据提示和现有代码实时生成从片段到完整功能的代码建议。类似Cursor和GithubCopilot编码工具。目前,CodeWhisperer兼容Python、Java和JavaScript,支持各种IDE,包括JetBrains、Vis......
  • MIT实验警示:人类或需要人工智能辅助才能理解复杂逻辑
    麻省理工实验揭示人类的天赋缺陷麻省理工学院林肯实验室(MITLincolnLaboratory)的一项研究表明,尽管形式规范具有数学上的精确性,但人类并不一定能对其进行解释。换句话说就是,人类在没有工具辅助的情况下,很难准确理解复杂的逻辑。研究人员将AI在游戏中的决策逻辑用原始公式、更自......