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

【JavaEE】——多线程常用类

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

引入:

一:Callable和FutureTask类

1:对比Runnable

2:FutureTask类

3:代码示例

示例一:Runnable

​编辑示例二:Callable

二:ReentrantLock——可重入锁

1:与synchronized的区别

(1)不会阻塞

(2)公平锁

(3)唤醒机制不同

三:Semaphore——信号量

1:P操作

2:V操作

3:PV代码示例一

4:锁功能

四:CountDownLatch

1:引入

2:代码示例


引入:

通过之前的学习,我们了解到CAS本质上是JVM替我们封装好的,我们没有办法感知到

java.util.concurrent中存放了一些我们多线程编程时常用的类

看下面的一些接口:是不是非常熟悉,我们把这个packet包简称为(JUC)

e9ca2cbd045a46b1bbf59c50a57bf57b.png

一:Callable和FutureTask类

读法:“开了波哦”    译为:调用

1:对比Runnable

Runnable提供run方法返回值为void——关注过程,不关注执行结果

Callable提供call方法返回值类型就是执行结果的类型———更关注结果

2:FutureTask类

在Callable中的call方法中完成任务的描述后,我们要想办法把这个任务加载给线程Thread

但是Thread类中并没有给出Callable的构造方法,于是我们通过FutureTask这个中间类(可以理解为加载任务的装置),作为媒介,发射给Thread

即:

Callable中描述方法——卢本伟来啦~~

FutureTask中加载任务——卢本伟已准备就绪~~

Thread中传入futureTask任务执行——卢本伟启动!!

注:

Callable和FutureTask实例化的时候<>中要写返回结果的类型哦。

futureTask.get()方法是带有阻塞功能的,如果线程还没有执行完毕,get就会被阻塞,等到线程执行完了,return的结果就会被get返回回来

3:代码示例

老问题:计算前5000个数字之和
 

看以下两段代码——用Callable类写的代码比Runnable类写的代码更加优雅~~

示例一:Runnable

package thread;public class ThreadDemon37 {private static int sum = 0;//全局变量用来保存最后的结果值public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new Runnable() {int count = 0;//局部变量@Overridepublic void run() {for (int i = 1 ; i <= 5000 ; i++){count += i;}sum = count;}});t1.start();t1.join();System.out.println(sum);}}

c187a3ca91944a6bab8894d443652fed.png示例二:Callable

此处我们不用再引入额外的成员变量了,直接借助返回值即可

package thread;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class ThreadDemon38 {public static void main(String[] args) throws InterruptedException, ExecutionException {Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i <= 5000; i++) {sum += i;}return sum;}};//Thread t1 = new Thread(callable);//Thread中没有提供构造函数来传入callable//引入FutureTask类,未来要完成的任务(任务还未执行)// 相当于在Callable中确定执行的任务//在FutureTask装置中完成任务加载——卢本伟准备就绪~~~//最后引入线程——卢本伟启动!!FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread t1 = new Thread(futureTask);t1.start();t1.join();System.out.println(futureTask.get());//装置获得一下结果}
}

f9ffe1814187431eaf22c06ab0cba29c.png

补充一点:.futureTask.get()方法本身自带阻塞特性,如果Callable任务还没有执行完,是会一直等待它的返回值结果的

二:ReentrantLock——可重入锁

读音:“瑞安纯特老科” 翻译为:可重入锁

科普:ReentrantLock在很早以前是比没有发展起来的synchronized功能更加强大的,他提供了两个传统的方法lock和unlock,但是在写代码的过程中lock完后往往会忘记unlock解锁,所以一般把unlock操作放到finally里面使用

1:与synchronized的区别

(1)不会阻塞

我们知道synchronized加锁,如果线程“锁竞争”失败,会陷入阻塞等待,使用了ReentrantLodk提供了trylock方法后,如果加不上锁就会返回false,不会阻塞等待。

(2)公平锁

ReentrantLock中加锁依据是:公平锁,所有参与“加锁”的线程会被放进队列里面,按顺序进行加锁

(3)唤醒机制不同

synchronized提供wait和notify,ReentrantLock搭配Condition,功能比notify强一点

三:Semaphore——信号量

读音:“赛摸佛尔” 翻译为:信号量

科普:因为发明信号量的大佬迪杰斯特拉是个荷兰人,荷兰语的申请和释放首字母分别是P和V。实际上英语是acquire和release

1:P操作

申请一个可用资源,可用资源总数就会-1

2:V操作

释放一个可用资源,可用资源总数就会+1

打个比方:去停车场停车,现在有50个停车位,申请一个停车位(p操作),现有可用停车位为49;出来了一辆车(v操作),现有可用停车位为50;

3:PV代码示例一

package thread;import java.util.concurrent.Semaphore;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-09-30* Time: 10:26*/
public class ThreadDemon39 {public static void main(String[] args) throws InterruptedException {Semaphore semaphore = new Semaphore(1);//资源数限制为1个semaphore.acquire();System.out.println("p操作");semaphore.acquire();//第二次申请System.out.println("p操作");semaphore.acquire();//第三次申请System.out.println("p操作");}
}

9cf9b627497042ea9426d8388842301a.png

4:锁功能

信号量是更为广义的锁

代码示例:继续沿用解决count计数器++线程安全问题的方式

package thread;import java.util.concurrent.Semaphore;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-09-30* Time: 10:33*/
public class ThreadDemon40 {private static int count = 0;//引入Semaphore进行加锁private static Semaphore semaphore = new Semaphore(1);public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {try {semaphore.acquire();//加锁for (int i = 1 ; i <= 50000 ; i++){count++;}} catch (InterruptedException e) {throw new RuntimeException(e);}semaphore.release();//解锁});Thread t2 = new Thread(() ->{try {semaphore.acquire();//加锁for (int i = 1 ; i <= 50000 ; i++){count++;}} catch (InterruptedException e) {throw new RuntimeException(e);}semaphore.release();//解锁});t1.start();t2.start();t1.join();t2.join();System.out.println(count);}
}

4f2381686367498d83b6d9736d662e7c.png

四:CountDownLatch

1:引入

latch(锁存器)

举个例子,现在下载软件的速度非常快,用的是多线程下载方式,比如要下载一个1G大小的软件,我们把这个任务分成10份,分给10个线程同时进行下载,最后在拼在一起,速度就会快非常多。

这个“拼”的操作,就能被CountDownLatch感知到,比我们用join要更简单方便一些

2:代码示例

package thread;import java.util.Random;
import java.util.concurrent.CountDownLatch;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-09-30* Time: 10:57*/
public class ThreadDemon41 {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(10);//创建10个线程Random random = new Random();int time = (random.nextInt(4)+1)*1000;//time的范围[0,4]->[1,5]->[1000,5000]for(int i = 1 ; i <= 10 ; i++){int count = i;Thread t = new Thread(() ->{try {Thread.sleep(random.nextInt(time));//产生的随机数的范围System.out.println("第" + count + "线程的任务执行完毕");latch.countDown();//告知CountDownLatch有一个任务已经执行完毕了} catch (InterruptedException e) {throw new RuntimeException(e);}});t.start();}latch.await();//如果CountDownLatch中的任务还没有执行完毕,那么CountDownLatch就会陷入阻塞等待System.out.println("所有任务都已经执行完毕了");}
}

ab344df1b057467297751a6554e614ea.png

相关文章:

【JavaEE】——多线程常用类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a; 一&#xff1a;Callable和FutureTask类 1&#xff1a;对比Runnable 2&#xff1a…...

Cilium-实战系列-(二)Cilium-Multi Networking-多网络

一、Cilium必要开启的功能 1、enable-multi-network 2、ipam模式选择:multi-pool 二、涉及的CRD资源 1、 ciliumpodippools.cilium.io *通过Cilium管理节点上的pod cidr.网络分为主网络和第二网络。 *主网络的 ciliumpodippools.cilium.io default根据配置文件默认生成的。 …...

springboot自动配置

自动配置的核心就在SpringBootApplication注解上&#xff0c;SpringBootApplication这个注解 底层包含了3个注解&#xff0c;分别是&#xff1a; SpringBootConfiguration ComponentScan EnableAutoConfiguration EnableAutoConfiguration这个注解才是自动配置的核心,它 封…...

mock数据,不使用springboot的单元测试

业务代码 package com.haier.configure.service.impl;import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.haier.common.util.RequestUtil; import com.haier.configure.entity.Langua…...

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化&#xff08;Pooling&#xff09;是深度学习中常用的一种操作&#xff0c;用于降低卷积神经网络&#xff08;CNN&#xff09;或循环神经网…...

职场上的人情世故,你知多少?这五点一定要了解

职场是一个由人组成的复杂社交网络&#xff0c;人情世故在其中起着至关重要的作用。良好的人际关系可以帮助我们更好地融入团队&#xff0c;提升工作效率&#xff0c;甚至影响职业发展。在职场中&#xff0c;我们需要了解一些关键要素&#xff0c;以更好地处理人际关系&#xf…...

Python | Leetcode Python题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution:def find132pattern(self, nums: List[int]) -> bool:candidate_i, candidate_j [-nums[0]], [-nums[0]]for v in nums[1:]:idx_i bisect.bisect_right(candidate_i, -v)idx_j bisect.bisect_left(candidate_j, -v)if…...

【重学 MySQL】五十四、整型数据类型

【重学 MySQL】五十四、整型数据类型 整型类型TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff09;BIGINT 可选属性UNSIGNEDZEROFILL显示宽度&#xff08;M&#xff09;AUTO_INCREMENT注意事项 适合场景TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff0…...

查看 Git 对象存储中的内容

查看 Git 对象存储中的内容 ls -C .git/objects/<dir>ls: 列出目录内容的命令。-C: 以列的形式显示内容。.git/objects/<dir>: .git 是存储仓库信息的 Git 目录&#xff0c;objects 是其中存储对象的子目录。<dir> 是对象存储目录下的一个特定的子目录。 此…...

Redis 中热 Key 的判定及其解决方案

引言 Redis 作为高效的内存数据库&#xff0c;常用于缓存、消息队列等场景。随着数据量和并发量的增加&#xff0c;某些数据的访问频率会远远高于其他数据&#xff0c;这些被频繁访问的 Key 被称为 热 Key。热 Key 问题是 Redis 应用中常见的性能瓶颈之一&#xff0c;它可能导…...

elasticsearch创建索引

1对比关系型数据库&#xff0c;创建索引就等同于创建数据库 在postman中&#xff0c;向ES服务器发PUT请求 显示已经创建成功了 http://192.168.1.108:9200/shopping 请求方式get http://192.168.1.108:9200/shopping 请求全部的index的url地址 get 请求 http://192.168.1.10…...

【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 pwm驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器输出PWM配置步骤main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "pwm.h"int main(void) {HA…...

计算机网络:物理层 —— 信道复用技术

文章目录 信道信道复用技术信道复用技术的作用基本原理常用的信道复用技术频分复用 FDM时分复用 TDM波分复用 WDM码分复用 CDM码片向量基本原理 信道 信道是指信息传输的通道或介质。在通信中&#xff0c;信道扮演着传输信息的媒介的角色&#xff0c;将发送方发送的信号传递给…...

期权懂|期权交易涨跌幅限制会随时调整吗?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;期权交易涨跌幅限制会随时调整吗&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权交易涨跌幅限制会随时调整吗&#xff1f; 涨跌幅…...

阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?

这玩意儿表面看上去挺牛逼&#xff0c;但其实背后的逻辑和套路&#xff0c;在咱们开发里见过的那些招数&#xff0c;都能找到影子。 今天小北和大家一起系统化的梳理梳理一遍&#xff0c;让大家功力猛增&#xff0c;吊打面试官。 1. 消息存储&#xff1a;巧妙利用顺序写 先说…...

web:js原型污染简单解释

1. 什么是对象&#xff1f; 在 JavaScript 中&#xff0c;对象是一种包含属性和方法的数据结构。你可以把对象想象成一个存储键值对的容器。每个键&#xff08;key&#xff09;都有一个对应的值&#xff08;value&#xff09;&#xff0c;这个值可以是数据或者函数。 let per…...

【C++打怪之路Lv7】-- 模板初阶

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…...

实战OpenCV之模板匹配

基础入门 模板匹配是计算机视觉中一种常用的图像处理技术,用于在较大的目标图像中寻找与给定模板图像相似的子区域。这项技术的基本思想是在主图像中寻找与模板图像最相似的子区域,广泛应用于目标检测、图像识别等领域。模板匹配的主要流程包括如下三点。 1、滑动窗口。将模板…...

【C++ 11】for 基于范围的循环

文章目录 【 1. 基本用法 】【 2. for 新格式的应用 】2.1 for 遍历字符串2.2 for 遍历列表2.3 for 遍历的同时修改元素 问题背景 C 11标准之前&#xff08;C 98/03 标准&#xff09;&#xff0c;如果要用 for 循环语句遍历一个数组或者容器&#xff0c;只能套用如下结构&#…...

创建索引时需要考虑的关键问题详解

引言 在数据库中&#xff0c;索引是加快数据查询速度的重要工具。通过索引&#xff0c;数据库可以快速定位需要的数据&#xff0c;而无需扫描整个表的数据。尽管索引能极大提高查询效率&#xff0c;但不合理的索引设计也可能导致性能下降&#xff0c;甚至增加不必要的系统开销…...

地质建模革命:如何使用GemPy在10分钟内构建专业3D地质模型 [特殊字符]

地质建模革命&#xff1a;如何使用GemPy在10分钟内构建专业3D地质模型 &#x1f680; 【免费下载链接】gempy GemPy is an open-source, Python-based 3-D structural geological modeling software, which allows the implicit (i.e. automatic) creation of complex geologic…...

化学合成革命:5分钟用AI完成复杂分子逆向合成路线设计

化学合成革命&#xff1a;5分钟用AI完成复杂分子逆向合成路线设计 【免费下载链接】aizynthfinder A tool for retrosynthetic planning 项目地址: https://gitcode.com/gh_mirrors/ai/aizynthfinder 你是否曾为设计一个复杂分子的合成路线而彻夜难眠&#xff1f;在传统…...

六自由度并联无人机自适应起降平台设计——从构型选型到运动学仿真全流程

六自由度并联无人机自适应起降平台设计——从构型选型到运动学仿真全流程 摘要 随着无人机物流配送、海上作业、灾害救援等场景的快速发展,无人机在动态环境下的安全起降成为制约其大规模应用的瓶颈问题。传统的固定起降平台无法适应舰船摇摆、车辆运动等动态条件,而串联机…...

长期使用Taotoken Token Plan套餐在项目开发中的成本优势体会

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期使用Taotoken Token Plan套餐在项目开发中的成本优势体会 在项目开发中&#xff0c;尤其是涉及大模型API调用的场景&#xff0…...

抖音直播数据采集:如何用Golang构建实时弹幕监控系统

抖音直播数据采集&#xff1a;如何用Golang构建实时弹幕监控系统 【免费下载链接】douyin-live-go 抖音(web) 弹幕爬虫 golang 实现 项目地址: https://gitcode.com/gh_mirrors/do/douyin-live-go 在直播电商和内容创作日益火爆的今天&#xff0c;数据驱动的运营决策变得…...

ComfyUI-Impact-Pack V8:AI图像增强的模块化革命与智能内存管理

ComfyUI-Impact-Pack V8&#xff1a;AI图像增强的模块化革命与智能内存管理 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址:…...

【实测可用 v 2.7.5】Open Claw 本地环境快速部署搭建攻略

✨ 核心亮点 零代码门槛&#xff5c;全程可视化&#xff5c;无需手动配环境&#xff5c;内置所有依赖 &#x1f517; 下载地址 https://xiake.yun/api/download/package/16?promoCodeIV8E496E2F7A &#x1f4dd; 前言 2026 年开源圈热门的「数字员工」OpenClaw&#xff08…...

XXMI启动器:6款热门二次元游戏模组一站式管理终极指南

XXMI启动器&#xff1a;6款热门二次元游戏模组一站式管理终极指南 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher XXMI启动器是一款专为二次元游戏爱好者设计的开源模组管理平台…...

2026年5款专业气象数据可视化软件大盘点

在科技飞速发展的今天&#xff0c;气象可视化作为一种将复杂气象数据转化为直观图像的技术&#xff0c;正发挥着越来越重要的作用。它不仅为气象工作者提供了便捷的数据分析手段&#xff0c;也让普通大众能够轻松理解天气变化。接下来&#xff0c;让我们一起深入了解气象可视化…...

Gradiant宣布完成E轮融资,公司估值达20亿美元,助力加快AI、半导体以及工业水务基建领域布局

随着Gradiant依托AI基建和先进制造业务实现业绩大幅增长&#xff0c;新资金将用于支持战略性并购、新一代技术研发以及上市筹备工作 Gradiant今日宣布完成E轮融资&#xff0c;公司估值达到20亿美元。本轮融资由Safar Partners和Hostplus Superannuation Fund领投&#xff0c;C…...