JUC之线程协作工具

自动驾驶系统架构解析:从传感器到决策控制的完整链路(附实际案例) 本文深入解析了自动驾驶系统从感知、决策到控制的完整架构链路。通过对比摄像头、毫米波雷达、激光雷达等核心传感器的特性与选型策略,阐述了多传感器融合的必要性。文章结合行为决策、运动规划及控制执行的实际案例,揭示了系统集成、数据闭环与功能安全等工程化落地的关键挑战,为理解自动驾驶技术提供了清晰的蓝图。 阅读详情

CountDownLatch倒数门闩

流程:倒数结束之前一直处于等待状态,直到倒数结束时,此线程才开始工作。

主要方法:

//构造方法传入倒数次数
 public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }



public void countDown() {
        sync.releaseShared(1);
    }



public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }

 使用场景:

  • 一个线程等待多个线程执行完毕,再继续自己的工作。一等多
  • 多个线程等待同一个信号。多等一

代码示例



/**
 * 描述:     模拟100米跑步,5名选手都准备好了,只等裁判员一声令下,所有人同时开始跑步。当所有人都到终点后,比赛结束。
 */
public class CountDownLatchDemo1And2 {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch begin = new CountDownLatch(1);

        CountDownLatch end = new CountDownLatch(5);
        ExecutorService service = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 5; i++) {
            final int no = i + 1;
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("No." + no + "准备完毕,等待发令枪");
                    try {
                        begin.await();
                        System.out.println("No." + no + "开始跑步了");
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("No." + no + "跑到终点了");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        end.countDown();
                    }
                }
            };
            service.submit(runnable);
        }
        //裁判员检查发令枪...
        Thread.sleep(5000);
        System.out.println("发令枪响,比赛开始!");
        begin.countDown();

        end.await();
        System.out.println("所有人到达终点,比赛结束");
    }
}

Semaphore信号量

使用场景:用来限制或者管理资源有限的使用情况。作用是维护一个许可证的计数,当信号量拥有的许可证为0时,那么下一个线程就需要等待直到有线程释放许可证。

代码示例



/**
 * 描述:     演示Semaphore用法
 */
public class SemaphoreDemo {

    static Semaphore semaphore = new Semaphore(5, true);

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(50);
        for (int i = 0; i < 100; i++) {
            service.submit(new Task());
        }
        service.shutdown();
    }

    static class Task implements Runnable {

        @Override
        public void run() {
            try {
                semaphore.acquire(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "拿到了许可证");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "释放了许可证");
            semaphore.release(2);
        }
    }
}

 Condition

代码示例:



/**
 * 描述:     演示用Condition实现生产者消费者模式
 */
public class ConditionDemo2 {

    private int queueSize = 10;
    private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
    private Lock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();

    public static void main(String[] args) {
        ConditionDemo2 conditionDemo2 = new ConditionDemo2();
        Producer producer = conditionDemo2.new Producer();
        Consumer consumer = conditionDemo2.new Consumer();
        producer.start();
        consumer.start();
    }

    class Consumer extends Thread {

        @Override
        public void run() {
            consume();
        }

        private void consume() {
            while (true) {
                lock.lock();
                try {
                    while (queue.size() == 0) {
                        System.out.println("队列空,等待数据");
                        try {
                            notEmpty.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    queue.poll();
                    notFull.signalAll();
                    System.out.println("从队列里取走了一个数据,队列剩余" + queue.size() + "个元素");
                } finally {
                    lock.unlock();
                }
            }
        }
    }

    class Producer extends Thread {

        @Override
        public void run() {
            produce();
        }

        private void produce() {
            while (true) {
                lock.lock();
                try {
                    while (queue.size() == queueSize) {
                        System.out.println("队列满,等待有空余");
                        try {
                            notFull.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    queue.offer(1);
                    notEmpty.signalAll();
                    System.out.println("向队列插入了一个元素,队列剩余空间" + (queueSize - queue.size()));
                } finally {
                    lock.unlock();
                }
            }
        }
    }

}

CyclicBarrier循环栅栏

代码示例:



/**
 * 描述:    演示CyclicBarrier
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
            @Override
            public void run() {
                System.out.println("所有人都到场了, 大家统一出发!");
            }
        });
        for (int i = 0; i < 10; i++) {
            new Thread(new Task(i, cyclicBarrier)).start();
        }
    }

    static class Task implements Runnable{
        private int id;
        private CyclicBarrier cyclicBarrier;

        public Task(int id, CyclicBarrier cyclicBarrier) {
            this.id = id;
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {
            System.out.println("线程" + id + "现在前往集合地点");
            try {
                Thread.sleep((long) (Math.random()*10000));
                System.out.println("线程"+id+"到了集合地点,开始等待其他人到达");
                cyclicBarrier.await();
                System.out.println("线程"+id+"出发了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

 与CountDownLatch的区别?

Pluto SDR新手避坑指南:从环境配置到第一个MATLAB收发程序(附完整代码) 本文为Pluto SDR新手提供全面的避坑指南,从硬件连接到MATLAB环境配置,再到第一个信号收发程序的实现。详细介绍了驱动安装、常见问题排查以及关键参数设置,帮助用户快速上手软件定义无线电(SDR)技术,并附有完整代码示例。 阅读详情

相关推荐

手动以及使用torch.nn实现前馈神经网络实验

手动以及使用torch.nn实现前馈神经网络 手动实现前馈神经网络解决上述回归、二分类、多分类任务 利用torch.nn解决上述回归、二分类、多分类任务 在多分类任务中使用至少三种不同的激活函数 对多分类任务中的模型评估隐藏层层数和隐藏单元个数对实验结果的影响

m0_52910424的博客 9373

控制并发流程,做好线程间的协调

线程一般是由线程调度器自动控制的,但有些场景需要按照我们程序员的意愿去实现多线程之间相互配合,从而满足业务逻辑。让线程A等待线程B执行完后再执行等一些相互合作的逻辑;或一系列线程等待一个线程运行完毕或发出信号之后再执行CountDownLatch(int count):仅有这一个构造函数,参数count为需要倒数的数值。await(): 调用 await() 方法的线程会被挂起,它会等待直到count值为0才继续执行。

Qynwang的博客 765

UDS诊断ISO14229新手入门篇

这个命令的格式稍微复杂一点。sub-function = 0x06 用于读取某个 DTC 及其相关的环境数据,此时 parameter 为 4 个 byte,前三个 byte 用于标识我们要读取的 DTC,第四个 byte 用于标识要读取的环境数据的范围,UDS 规定使用 FF 来表示读取所有的环境数据,各厂家可以要根据自己的需求定义其他的值来代表要读取的环境数据的范围。环境数据包括 DTC 状态,优先级,发生次数,老化计数器,时间戳,里程等,厂家还可以根据自己的需求定义一些此 DTC 产生时的测量数据。

weixin_45387165的博客 1974

并发控制工具类CountDownLatch、CyclicBarrier、Semaphore

让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒,CountDownLatch主要有2个方法,当一个或多个线程调用await方法时,调用线程会被阻塞,其他线程调用countDown方法时计数器减一(调用countDown方法不会阻塞线程),当计数器的值变为0时,因为调用方法被阻塞的线程会被唤醒,继续执行。N个线程相互等待,任何一个线程没有到达或完成时,所有的线程都必须互相等待。(信号量)可以用来限制能同时访问共享资源的线程上限,它内部维护了一个许可的变量,也就是线程许可的数量。1 收集到:1颗龙珠。

m0_37635053的博客 731

别再折腾端口了!Kali Nethunter Kex 图形化桌面连接失败的真正原因与一键修复(附Termux命令)

本文深入分析了Kali Nethunter Kex图形化桌面连接失败的真正原因,包括端口配置变更、依赖缺失和权限问题,并提供了一键修复方案和Termux命令。通过详细的诊断步骤和优化配置,帮助用户快速恢复Kex功能,提升移动安全测试效率。

weixin_42530732的博客 417

STM32CubeMX——循迹传感器TCRT5000的使用

前言 人生如逆旅,我亦是行人。 ————苏轼《临江仙·送钱穆父》 一、介绍 TCRT5000描述:(带有晶体管输出的反射光学传感器) TCRT5000是一种反射式光学传感器,它包括一个红外发射器和一个3.5mm引线封装的光电晶体管,可阻挡可见光。还具有1mA 典型被测输出电流,2.5mm峰值工作距离,可应用传感与仪表,工业等行业。 TCRT5000具有紧凑的结构,其中发射光源和探测器布置在同一方向,通过使用来自物体的反射红外光束来感知物体的存在。工作波长为950毫米,探测器由光电晶体管组成

W_Oilpicture的博客 1万+

如何做好多状态的流程控制

初次写流程控制的小伙伴肯都有体会,事务处理的流程中状态一旦多了,就会出现非常多的if-elseif 语句,对于出现Bug解决问题来说,不得不对整段代码的逻辑理一遍,然后才能分析出到底是哪里出了问题。那么,有什么别的好的解决方案吗? 在设计模式中,其实早就已经为我们考虑到了这一个场景,我们可以利用状态模式基本还原这样的任务。 整个实现上的核心基础类就是 基础状态抽象类 和基础有限自动机。业务状态标...

xxx 991

【数据库】SQL Server 2008 R2 安装全流程详解与常见问题避坑指南

本文详细解析了SQL Server 2008 R2的完整安装流程与核心配置。从安装前的系统兼容性检查、.NET Framework依赖准备,到图文详解实例配置、混合身份验证模式设置等关键步骤,并提供了安装失败、服务无法启动等高频问题的排查与避坑指南,帮助用户顺利完成部署。

java5的博客 1242

并行程序设计模式

第一部分:概念层 1.Future模式: 客户端发送请求,由于某种原因,服务器对请求的速度很慢,导致客户端一直处于等待状态中,因为方法的执行是同步的,所以只能等到它处理完了之后才能进行其他的处理。而Future就是针对这种情形,它会快速创建一个虚拟对象,里面是不包含真实数据的。而在真正用到它的地方返回真实数据。而在返回真实数据前的一段时间,我们是可以进行其他操作的。 2、Master-w

qq_24256955的博客 639

别再死记硬背参数了!用ADS手把手教你仿真一个4GHz镜像抑制混频器(附完整工程文件)

本文详细解析了4GHz镜像抑制混频器的ADS仿真全流程,从理论到实践,涵盖混频器设计基础、ADS工程搭建、二极管选型、非线性仿真及性能优化。通过实战案例,帮助工程师掌握关键参数平衡与调试技巧,提升射频电路设计效率。

weixin_42552716的博客 339

图形学基础|屏幕空间反射(SSR)

图形学基础|屏幕空间反射(SSR) 文章目录图形学基础|屏幕空间反射(SSR)一、前言二、反射技术概述2.1 环境贴图反射2.2 IBL反射2.3 平面反射(Planar Reflections)2.4 屏幕空间反射(Screen Space Reflection)2.4.1 SSR的基本原理2.4.2 SSR的优缺点三、SSR(Screen-Space Reflection)实现3.1 Efficient GPU Screen-Space Ray Tracing3.1.1 2D Raymarching v

【黑键】 3万+

计算机并发过程举例子,并发性Concurrency

并发性Concurrency1.1 什么是并发Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之前,我们首先必须了解什么是并发,以及它与并行性有什么不同。(Go is a concurrent language and not a parallel one. )并发性Concurrency是同时处理许多事情的能力。举个例子,假设一个人在晨跑。在晨跑时,他的鞋带松了。现在这个人停止跑步...

weixin_29171129的博客 1595

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中,Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件,Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。

I AM COMING BACK... 3550

JUC并发工具---线程协作

控制需要限制访问量的资源,没有获取到信号量的线程会被阻塞。

weixin_43558052的博客 554

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JUC 中的多线程协作工具类:CountDownLatch 和 CyclicBarrier

点击上方好好学java,选择星标公众号重磅资讯、干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 ...

好好学java 429

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JUC是Java并发工具包(Java Util Concurrent)的简称,通过使用JUC提供的工具类和组件,可以更方便地实现多线程编程,提高程序的并发性能和可靠性

通过使用JUC提供的工具类和组件,我们可以更方便地实现多线程编程。例如,我们可以使用Semaphore来控制同时执行的线程数量,使用CountDownLatch来实现线程的等待和通知,使用CyclicBarrier来实现线程的同步等。通过使用JUC提供的工具类和组件,可以更方便地实现多线程编程,提高程序的并发性能和可靠性。通过使用JUC提供的工具类和组件,我们可以更方便地实现多线程编程,提高程序的并发性能和可靠性。通过使用JUC提供的工具类和组件,可以更方便地实现多线程编程,提高程序的并发性能和可靠性。

[Blog][Domain] programb.blog.youkuaiyun.com 481

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java多线程并发JUC包 Exchanger 交换者

Java多线程并发JUC包 Exchanger 交换者

26857259 293

多线程与JUC并发编程

/ 自定义拒绝策略:将被拒绝的任务存入数据库,并发送告警@Override// 1. 将任务信息持久化到数据库(后续可人工重试)// 伪代码:保存任务详情// 2. 发送告警通知(如邮件、短信给开发人员)sendAlert("线程池任务被拒绝,任务信息:" + r.toString());// 伪代码:告警逻辑// 3. 可选:打印日志System.err.println("任务" + r + "被拒绝,当前线程池状态:" +

qzhqbb的博客 772

Java学习-JUC

Java关于并发编程下面的JUC工具包的学习,包含了CAS、常见锁、锁优化原理、并发容器等

qq_56760790的博客 1280

JUC(java中的多线程)

juc(Java里的多线程)

a16696747377的博客 4788

JUC 03

今天是2025/03/28 20:46 day 14

qq_65879241的博客 2017

Java - 基础 & JUC 多线程

基础多线程 1、程序 · 进程 · 线程 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念 进程是程序的一次执行过程,是一个动态的概念;进程是系统资源分配的单位 线程是CPU调度和执行的单位,是一个独立的执行路径;一个进程可以包含多个线程,且一个进程中至少应有一个线程,不然没有存在的意义 在程序运行时,即使没有自己创建线程,后台也会有线程在跑,如main主线程、gc垃圾回收线程等 主线程main()是系统的入口,用于执行程序 在一个进程中,如果开辟了多个线程,线程的运

qq_43613793的博客 349

初识线程Ⅶ之JUC

文章目录JUCReentrantLockSemaphoreCountDownLauthCyclicBarrierHashMapConcurrentHashMapHashtable JUC java.util.concurrent ReentrantLock lock写在try之前,防止没有加锁成功,如果写try里边,此异常会将正常业务逻辑处理的异常覆盖,不便于调试 一定要在finally中进行unlock() Semaphore 信号量 多把锁,用来控制锁的数量(实现限流功能) acquire():尝试

橘白呀啊的博客 177

JUC-01概述

1 什么是 JUC 1.1 JUC 简介 在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的。JUC就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包,JDK 1.5 开始出现的。 1.2 进程与线程 进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算

Logan的博客 304

Java多线程知识小结: JUC工具类及并发编程相关概念

Java并发编程核心概念包括:1.基础机制如volatile(可见性)、CAS(原子操作)和AQS(同步框架);2.锁工具(ReentrantLock、synchronized)和线程协作(Condition、wait/notify);3.无锁原子类和线程池体系(ThreadPoolExecutor、Future);4.同步工具(CountDownLatch、Semaphore)及并发容器(ConcurrentHashMap、BlockingQueue);5.线程本地存储(ThreadLocal)和分治框架

William Chen's knowledge base 558

JUC 01

今天是2025/03/26 15:21 day 12

qq_65879241的博客 2002
上一篇: JUC之并发容器
下一篇: JUC之AQS的学习
yan_pengfei
博客等级 码龄8年 16粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值