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

Java EE 多线程之 JUC

文章目录

  • 1. Callable 接口
  • 2. ReentrantLock
  • 3. 信号量
  • 4. CountDownLatch

JUC这里就是指(java.util.concurrent)
concurrent 就是并发的意思
这个包里的内容,主要就是一些多线程相关的组件

1. Callable 接口

Callable 也是一种创建线程的方式
适合与想让某个线程执行一个逻辑,并且返回结果的时候
相比之下,Runnable 不关注结果

在这里插入图片描述
这个和Runnable 方法很像
call 方法是 Callable 中的核心方法
返回值就是 Integer,期望值这个线程能够返回一个整数

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class ThreadDemo35 {public static void main(String[] args) throws ExecutionException, InterruptedException {//定义了任务Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i <= 1000; i++) {sum += i;}return sum;}};//把任务放到线程中进行执行FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread t = new Thread(futureTask);t.start();//此处的 get 就能获取到 callable 里面的返回结果//由于线程是并发执行的,执行到主线的 get 的时候,t 线程可能还没执行完//没执行完的话,get 就会阻塞System.out.println(futureTask.get());}
}

在这里插入图片描述
futureTask 在这里就是相当于让一个线程跑起来,我们来等待结果

就相当于去吃饭,扫码点单后会给你一个小票,可以凭小票取餐
点餐完成后,后厨就相当于一个线程,就开始执行了
这个过程中,我们需要等出餐
等餐好了,就可以那小票取餐

这个时候 futureTask 就相当于拿着小票换执行结果


这个时候我们创建线程的方式有增加了一种

线程创建的方式:

  1. 继承 Thread,重写 run(创建单独的类,也可以匿名内部类)
  2. 实现 Runnable,重写 run(创建单独的类,也可以匿名内部类)
  3. 实现 Callable,重写 call(创建单独的类,也可以匿名内部类)
  4. 使用 lambda 表达式
  5. ThreadFactory 线程工厂
  6. 线程池

2. ReentrantLock

可重⼊互斥锁,和 synchronized 定位类似,都是⽤来实现互斥效果,保证线程安全

ReentrantLock 的⽤法:
• lock():加锁,如果获取不到锁就死等
• trylock(超时时间):加锁,如果获取不到锁,等待⼀定的时间之后就放弃加锁
• unlock():解锁

ReentrantLock lock = new ReentrantLock();
-----------------------------------------
lock.lock();
try {// working
} finally {lock.unlock()
}

ReentrantLock 的优势:

  1. ReentrantLock ,在加锁的时候,有两种方式
    lock,tryLock(给了更多的可操作空间)
  2. ReentrantLock ,提供了公平锁的实现(默认情况下是非公平锁)
  3. ReentrantLock 提供了更强大的等待通知机制
    搭配了Condition 类,实现等待通知,可以更精确控制唤醒某个指定的线程

虽然 ReentrantLock 有上述优势,但是在加锁的时候,首选还是 synchronized
但是很明显,ReentrantLock 使用更复杂,尤其容易忘记解锁

3. 信号量

信号量也是操作系统中,比较重要的概念

信号量,就是一个计数器,描述了“可用资源”的个数


举个栗子:
可以把信号量想象成是停⻋场的展⽰牌:
当前有⻋位 100 个,表⽰有 100 个可⽤资源
当有⻋开进去的时候,就相当于申请⼀个可⽤资源,可⽤⻋位就 -1 (这个称为信号量的 P 操作)
当有⻋开出来的时候,就相当于释放⼀个可⽤资源,可⽤⻋位就 +1 (这个称为信号量的 V 操作)
如果计数器的值已经为 0 了,还尝试申请资源,就会阻塞等待,直到有其他线程释放资源


英语中 P 操作 用 acquire
V 操作 用 release


锁,本质上就是属于一种特殊的信号量
锁就是 可用资源为 1 的信号量
加锁操作,P 操作,1 变成 0
解锁操作,V 操作,0 变成 1
这其实就是二元信号量


操作刺痛,提供了 信号量 实现,提供了 api,JVM 封装了这样的 api,就可以在 java 代码中使用了

public class ThreadDemo36 {public static void main(String[] args) throws InterruptedException {Semaphore semaphore = new Semaphore(4);semaphore.acquire();System.out.println("P 操作");semaphore.acquire();System.out.println("P 操作");semaphore.acquire();System.out.println("P 操作");semaphore.acquire();System.out.println("P 操作");semaphore.acquire();System.out.println("P 操作");//semaphore.release();}
}

在这里插入图片描述
这里第五次操作会堵塞

开发中如果遇到了需要申请资源的常见,就可以使用信号量来实现

4. CountDownLatch

CountDownLatch 主要是适用于,多个线程来完成一系列任务的时候,用来衡量任务的进程是否完成
比如把一个大的任务,拆分成多个小的任务,让这些任务并发的去执行

就可以使用 CountDownLatch 来判定说当前这些任务是否都完成了


下载一个文件,就可以使用多线程下载
在我们的生活中,很多下载工具的下载速度很慢
相比之下,有一些专业的下载工具,就可以成倍的提升(比如 IDM)

这个时候普通的下载软件,往往和资源服务器,只有一个链接,服务器往往会对于链接传输的速度有限制
而专业的软件,往往是多线程下载,每个线程都建立一个链接,此时就需要把任务进行分割


CountDownLatch 主要有两个方法:

  1. await ,调用的时候就会阻塞,就会等待其他的线程完成任务,所有的线程都完成了任务之后,此时这个 await 才会返回,才会继续往下走
  2. countDown ,告诉 CountDownLatch ,我当前这一个子任务已经完成
public class ThreadDemo37 {public static void main(String[] args) throws InterruptedException {//10 个选手参赛,await 就会在 10次调用完 countDown 之后才能继续执行CountDownLatch countDownLatch = new CountDownLatch(10);for (int i = 0; i < 10; i++) {int id = i;Thread t = new Thread(() -> {System.out.println("thread " + id);try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}//通知说当前的任务执行完毕了countDownLatch.countDown();});t.start();}countDownLatch.await();System.out.println("所有的任务都完成了");}
}

在这里插入图片描述
如果是 i < 9,这里就会进行阻塞

相关文章:

Java EE 多线程之 JUC

文章目录 1. Callable 接口2. ReentrantLock3. 信号量4. CountDownLatch JUC这里就是指&#xff08;java.util.concurrent&#xff09; concurrent 就是并发的意思 这个包里的内容&#xff0c;主要就是一些多线程相关的组件 1. Callable 接口 Callable 也是一种创建线程的方式…...

Unity光照模型实践

光照作为3D渲染中最重要的部分之一&#xff0c;如何去模拟真实环境的光照是重要的研究内容&#xff0c;但是现实环境光照过于复杂&#xff0c;有很多经典好用的光照模型去近似真实光照。 根据基础的Phong模型 最终某个点的结果为 环境光Ambient 漫反射光Diffuse 高光Specula…...

从0创建并部署一个网页到服务器

创建一个页面 1 下载node.js 下载VScode 2 在Windows下找一个路径新建一个文件夹 例如&#xff1a;D:\study_project\PersonalWeb 3 VSCodee中打开文件夹 4 Windows下 管理员身份打开命令提示符&#xff0c;执行npm install -g vue/cli 5 VSCode下打开终端&#xff0c;执…...

Ubuntu 22.04 安装 OCI CLI

Ubuntu 22.04 安装 OCI CLI 安装命令 安装命令 wget https://codeload.github.com/oracle/oci-cli/zip/master -O oci-cli.zip pip install oci-cli.zip完结&#xff01;...

K8S的安装工具

kubectl Kubernetes 命令行工具 kubectl&#xff0c; 让你可以对 Kubernetes 集群运行命令。 你可以使用 kubectl 来部署应用、监测和管理集群资源以及查看日志。 有关更多信息&#xff0c;包括 kubectl 操作的完整列表&#xff0c;请参见 kubectl参考文件。 kubectl 可安装在…...

vue中哪些数组的方法可以做到响应式

Vue2 中为什么直接通过数组的索引修改元素是不会触发视图更新 vue2 为什么不直接监听数组 Vue2 对于数组提供了一些变异方法 重写数组方法源码分析 定义拦截器将拦截器挂载到数组上面收集依赖 扩展&#xff1a;理解Vue2如何解决数组和对象的响应式问题 对复杂对象的处理 复杂对…...

软考科目如何选择?

软考科目繁多&#xff0c;让许多学弟学妹感到困惑&#xff0c;不知道该选择哪个科目。以下是一些建议&#xff0c;可以根据个人实际需求选择备考的科目。 1、初级是可选的 软考初级非常简单&#xff0c;适合刚刚入门学习的朋友报考。对于一些有基础的朋友&#xff0c;建议直接…...

羊大师解读,血压波动

羊大师解读&#xff0c;血压波动 血压是身体健康的一个重要指标&#xff0c;但有时候我们会发现血压存在着波动的情况。血压波动的原因有很多&#xff0c;包括生活方式、遗传因素、药物影响等等。本文小编羊大师将为大家详细介绍血压波动的原因&#xff0c;以及预防和管理血压…...

关于充值!购买的流量卡第一次在哪充值?这个问题你想过吗?

手机套餐太贵、物联卡体验又不好&#xff0c;而官网申请的流量卡又都是定向流量&#xff0c;所以&#xff0c;运营商推出的只能线上申请的大流量卡一时之间便成了大家关注的焦点。 ​  在流量卡的使用过程中&#xff0c;申请是免费的&#xff0c;快递是免费的&#xff0c;但…...

HTML基础标签

但实际上无论声明为中文还是英文都可以写&#xff0c;中文/英文 主要是浏览器在进行调用翻译功能的时候&#xff0c;会按照声明的语言来进行翻译。 标签语义&#xff1a; 标签的属性一般都是在第一个标签中定义该标签效果所拥有的属性。 即标签的作用是什么 <>标签功能…...

人大金仓引领医疗行业新标准

近日&#xff0c;由中国信息产业商会团体标准委员会主办&#xff0c;人大金仓与国家电子计算机质量检验检测中心&#xff08;北京尊冠科技有限公司&#xff09;联合承办的《基于医疗应用的国产关系型数据库能力评价规范》团体标准研讨会顺利召开。 “ 各大知名医院专家云集 深入…...

【UML】NO.1 UML简介

目录 一、什么是UML 二、UML和软件工程 三、UML的诞生 四、UML的基本构成 从今天开始&#xff0c;开一个新的话题&#xff0c;把UML梳理一遍。 一、什么是UML UML&#xff08;Unified Modeling Language,UML&#xff09;是一个通用的可视化建模语言标准&#xff0c;用于对…...

【Idea】SpringBoot项目中,jar包引用冲突异常的排查 / SM2算法中使用bcprov-jdk15to18的报错冲突问题

问题描述以及解决方法&#xff1a; 项目中使用了bcprov-jdk15to18 pom依赖&#xff0c;但是发现代码中引入的版本不正确。 追溯代码发现版本引入的是bcprov-jdk15on&#xff0c;而不是bcprov-jdk15to18&#xff0c;但是我找了半天pom依赖也没有发现有引入bcprov-jdk15on依赖。…...

MISRA C++ 2023:C和C++测试解决方案实现静态分析

自动化软件测试解决方案的全球领导者Parasoft今天宣布&#xff0c;随着Parasoft C/Ctest 2023.2即将发布&#xff0c;全面支持MISRA C 2023。Parasoft针对C和C软件开发的完全集成测试解决方案计划于2023年12月发布&#xff0c;可以帮助团队实现自动化静态分析和编码标准合规性&…...

半导体:Gem/Secs基本协议库的开发(4)

继续接上篇 《半导体&#xff1a;Gem/Secs基本协议库的开发&#xff08;3&#xff09;》&#xff0c;本篇我们分享的比较简单&#xff0c;windows系统下tcp和串口通讯。这也是我们协议开发比较重要的一部分&#xff0c;不过我们在此把它封装程一个单独的通讯库&#xff0c;毕竟…...

解锁知识的新大门:自建知识付费小程序的技术指南

在数字化时代&#xff0c;知识付费小程序的崛起为创作者和学习者提供了全新的学习和分享方式。本文将以“知识付费小程序源码”为关键词&#xff0c;从技术角度出发&#xff0c;为你展示如何搭建一个独具特色的知识付费平台。 步骤1&#xff1a;选择适用的知识付费小程序源码…...

Java8实战 - 行为参数化传递代码

背景&#xff1a; 根据《java8实战》把第二章简单概括一下。 在软件工程中&#xff0c;一个最重要的问题是&#xff0c;用户的需求会一直变化&#xff0c;如何应对不断变化的需求&#xff0c;并且把工作量降到最低是需要考虑的&#xff0c;而行为参数化就是一个处理频繁变更需…...

jmeter,取“临时重定向的登录接口”响应头中的cookie

1、线程组--创建线程组&#xff1b; 2、线程组--添加--取样器--HTTP请求&#xff1b; 3、Http请求--添加--后置处理器--正则表达式提取器&#xff1b; 4、线程组--添加--监听器--查看结果树&#xff1b; 5、线程组--添加--取样器--调试取样器。 首先理解 自动重定向 与跟随…...

流程控制之条件判断

目录 流程控制之条件判断 2.1.if语句语法 2.1.1单分支结构 2.1.2双分支结构 2.1.3多分支结构 2.2.案例 例一: 例2: 例3: 例4: 例5: 例6: 例7: 例8: 例9: 2.3.case多条件判断 2.3.1.格式 2.3.2.执行过程 例10: 流程控制之条件判断 2.1.if语句语法 2.1.1单分…...

2 - Electron 核心概念

Electron 核心概念 主进程 通过Node.js、Electron提供的API与系统底层打交道启动项目时运行的 main.js 脚本就是我们说的主进程。在主进程运行的脚本可以以创建 Web 页面的形式展示 GUI。主进程只有一个 渲染进程 每个 Electron 的页面都在运行着自己的进程&#xff0c;这样…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...