JUC(java.util.concuurrent)的常见类介绍
Java 并发包(java.util.concurrent,简称 JUC)提供了一系列的工具和框架,用于简化并发编程。以下是 JUC 包中常见类的介绍:
-
Callable:
Callable接口是 Java 提供的一个带返回值的任务接口,类似于Runnable接口,但是它可以在执行结束后返回一个结果,也可以抛出异常。通常与ExecutorService结合使用,可以提交给线程池执行。public class CallableUse {public static void main(String[] args) {//第一种写法FutureTask<Integer> futureTask1 = new FutureTask<Integer>(new Callable<Integer>() {public Integer call() {int sum = 0;for (int i = 0; i < 1001; i++) {sum += i;}return sum;}});Thread thread = new Thread(futureTask1);thread.start();//第二种写法Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 1001; i++) {sum += i;}return sum;}};FutureTask<Integer> futureTask2 = new FutureTask<>(callable);Thread thread2 = new Thread(futureTask2);thread2.start();} }实现
Callable接口的类必须实现call()方法,该方法定义了需要执行的任务,并可以返回一个结果。通过ExecutorService的submit(Callable)方法提交一个Callable任务,返回一个Futuretask对象,可以通过该对象获取任务执行的结果
-
ReentrantLock:
ReentrantLock是一种可重入锁,它提供了与synchronized关键字相同的功能,即确保代码块在同一时刻只有一个线程执行,但相比synchronized更灵活,例如它支持公平性和非公平性,以及可中断性等特性。import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private static final Lock lock = new ReentrantLock();public static void main(String[] args) {new Thread(() -> {lock.lock();try {System.out.println("Thread 1 acquired the lock");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}).start();new Thread(() -> {lock.lock();try {System.out.println("Thread 2 acquired the lock");} finally {lock.unlock();}}).start();} }相对于synchronized,优势有三:
-
其提供了trylock(超过时间):加锁,如果得不到锁对象,一段时间后放弃加锁。
-
可以是公平锁,在构造方法new ReentrantLock();可以给一个true开启
-
更加强大的唤醒机制,synchronized基于锁的wait与notify,唤醒的线程随机,reentrantlock可以搭配Condition类实现唤醒,可以唤醒指定线程
-
- 使用
ReentrantLock的典型操作包括:- 调用
lock()方法获取锁。 - 在
try-finally块中执行需要保护的临界区代码。 - 调用
unlock()方法释放锁。
- 调用
- 可以使用
ReentrantLock的tryLock()方法尝试获取锁而不阻塞,或者使用lockInterruptibly()方法在获取锁的过程中可以响应中断
-
原子类:
- JUC 提供了一系列的原子类,如
AtomicInteger、AtomicLong、AtomicBoolean等,它们提供了一种线程安全的方式来进行原子操作,保证了操作的原子性。这些类底层使用了 CAS(Compare And Swap)操作来保证线程安全,常用于需要高效并发操作的场景。详见文章常见锁策略,synchronized内部原理以及CAS-CSDN博客
- JUC 提供了一系列的原子类,如
-
线程池:
- 线程池是管理线程的一种机制,它可以重用已创建的线程,减少了线程创建和销毁的开销,并且可以控制并发线程的数量。JUC 提供了
ThreadPoolExecutor类来实现线程池,也提供了一些方便的工厂方法,如Executors.newFixedThreadPool()、Executors.newCachedThreadPool()等来创建不同类型的线程池。详见文章Java线程池 ThreadPoolExecutor, Executor-CSDN博客
- 线程池是管理线程的一种机制,它可以重用已创建的线程,减少了线程创建和销毁的开销,并且可以控制并发线程的数量。JUC 提供了
-
Semaphore:
Semaphore是一种计数信号量,它可以限制同时访问某个资源的线程数量。它维护了一定数量的许可证,每次线程访问资源前需要获取许可证,如果许可证数量不足,则线程将被阻塞。一旦线程使用完资源,它将释放许可证,使得其他线程可以继续访问资源。import java.util.concurrent.Semaphore;public class SemaphoreExample {private static final Semaphore semaphore = new Semaphore(2);public static void main(String[] args) {for (int i = 0; i < 5; i++) {new Thread(() -> {try {semaphore.acquire();System.out.println("Thread acquired semaphore");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();System.out.println("Thread released semaphore");}}).start();}} }Semaphore的典型操作包括:调用acquire()方法获取一个许可证,如果没有可用的许可证则会阻塞。在try-finally块中执行需要获取许可证保护的代码。调用release()方法释放一个许可证。(PV操作)
-
CountDownLatch:
CountDownLatch是一种同步工具,它可以使一个或多个线程等待其他线程执行完特定操作后再继续执行。它通过一个计数器来实现,当计数器减为零时,等待的线程可以继续执行。CountDownLatch常用于实现线程之间的协调和同步。public class CountDownLatchUse {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(10);for (int i = 0; i < 10; i++) {Thread thread = new Thread(()->{int delay = (int) (Math.random()*10000+1000);try {Thread.sleep(delay);} catch (InterruptedException e) {throw new RuntimeException(e);}countDownLatch.countDown();System.out.println(Thread.currentThread().getId());});thread.start();}countDownLatch.await();System.out.println("the end");} }CountDownLatch的典型操作包括:- 创建
CountDownLatch对象时指定初始计数器值。 - 在需要等待的线程调用
await()方法等待计数器归零。 - 在其他线程中执行操作完成后,调用
countDown()方法递减计数器。
- 创建
- 可以通过
await(long timeout, TimeUnit unit)方法设置等待超时时间,或者通过getCount()方法获取当前计数器值。
综上一些方式,都是为了解决多线程下线程安全以及提高效率的方式。
相关文章:
JUC(java.util.concuurrent)的常见类介绍
Java 并发包(java.util.concurrent,简称 JUC)提供了一系列的工具和框架,用于简化并发编程。以下是 JUC 包中常见类的介绍: Callable: Callable 接口是 Java 提供的一个带返回值的任务接口,类似于…...
【中科院计算所】WSDM 2024冠军方案:基于大模型进行多文档问答
作者:李一鸣 张兆 中科院计算所 会话式多文档问答旨在根据检索到的文档以及上下文对话来回答特定问题。 在本文中,我们介绍了 WSDM Cup 2024 中“对话式多文档 QA”挑战赛的获胜方法,该方法利用了大型语言模型 (LLM) 卓越的自然语言理解和生…...
Android提供了多种方式来打开特定文件夹中的视频
使用 MediaStore获取指定文件夹的视频,更优化方法: import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.net.Uri; import android.os.Build; import android.os.Environme…...
基于django的购物商城系统
摘要 本文介绍了基于Django框架开发的购物商城系统。随着电子商务的兴起,购物商城系统成为了许多企业和个人创业者的首选。Django作为一个高效、稳定且易于扩展的Python web框架,为开发者提供了便捷的开发环境和丰富的功能模块,使得开发购物商…...
Swagger3 使用详解
Swagger3 使用详解 一、简介1 引入依赖2 开启注解3 增加一个测试接口4 启动服务报错1.5 重新启动6 打开地址:http://localhost:8093/swagger-ui/index.html 二、Swagger的注解1.注解Api和ApiOperation2.注解ApiModel和ApiModelProperty3.注解ApiImplicitParams和Api…...
JVM 第二部分-2(堆,方法区)
4.堆 堆 一个Java程序(main方法)对应一个jvm实例,一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建,大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域,是垃圾回收的重点区域堆可以位…...
蓝桥杯Java B组历年真题(2013年-2019年)
一、2013年真题 1、世纪末的星期 使用日期类判断就行,这里使用LocalDate,也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…...
你是谁,便会遇见谁
就会进什么样的圈子。努力提升自己,才是提升阶层最可靠的方法。 在人生的舞台上,每一个人都是自己人生的主角。而在这个旅程中,我们会遇见各种各样的人,进入不同的社交圈子。正如一句古训所说:“你是谁,便…...
Linux/Centos 部署静态IP,解决无法访问目标主机、Destination Host Unreachable、无法ping通互联网的问题
Linux/Centos 部署IP,解决无法访问目标主机、Destination Host Unreachable、无法ping通互联网的问题 Linux/Centos 部署静态IP查物理机/自身电脑的IP设置VMware上的虚拟网络编辑器设置网卡IP,激活至此就可访问百度了 Linux/Centos 部署静态IP 需要注意…...
在学习云原生的时候,一直会报错ImagePullBackOff Back-off pulling image
在学习云原生的时候,一直会报错 (见最后几张图) ImagePullBackOff Back-off pulling image 然后我就在像。这个配置的镜像是不是可以自己直接下载,但是好像不怎么搜索得到 然后就在想,这个lfy_k8s_images到底是个啥玩…...
Android Activity跳转详解
在Android应用程序中,Activity之间的跳转是非常常见的操作,通过跳转可以实现不同界面之间的切换和交互。在本篇博客中,我们将介绍Android中Activity跳转的相关知识,包括基本跳转、传递参数、返回数据以及跳转到浏览器、拨号应用和…...
计算机网络(2)-----数据链路层
目录 一.数据链路层的基本概念 二.数据链路层的功能概述 功能一:为网络层提供服务。无确认无连接服务,有确认无连接服务,有确认面向连接服务。 功能二:链路管理,即连接的建立、维持、释放(用于面向连接的服务)。 功能三:组帧 透明传输:…...
贪心算法(算法竞赛、蓝桥杯)--修理牛棚
1、B站视频链接:A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接:[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…...
【AIGC】微笑的秘密花园:红玫瑰与少女的美好相遇
在这个迷人的画面中,我们目睹了一个迷人的时刻,女子则拥有一头柔顺亮丽的秀发,明亮的眼睛如同星河般璀璨,优雅而灵动,她的微笑如春日暖阳,温暖而又迷人。站在红玫瑰花瓣的惊人洪水中。 在一片湛蓝无云的晴…...
vue3 中 主题定制
vue3 中 主题定制 背景 做多主题定制,黑/白 ,里面还要再分各种颜色,每次进来都要记住上次的主题设置 效果图 一、目录结构 ├── generated │ ├── theme │ │ └── dark-yellow.ts │ │ └── dark-orange.ts │ │…...
数据分析之Logistic回归分析(二元逻辑回归、多元有序逻辑回归、多元无序逻辑回归)
1、Logistic回归分类 在研究X对于Y的影响时: 如果Y为定量数据,那么使用多元线性回归分析;如果Y为定类数据,那么使用Logistic回归分析。 结合实际情况,可以将Logistic回归分析分为3类: 二元Logistic回归…...
【c++】通讯录管理系统
1.系统功能介绍及展示 2.创建项目 3.菜单实现 4.退出功能实现 5.添加联系人—结构体设计 6.添加联系人—功能实现 7.显示联系人 8.删除练习人—检测联系人是否存在 9.删除联系人—功能实现 10.查找联系人 11.修改联系人 12.清空通讯录 #include <iostream> #include <…...
Tomcat 架构
一、Http工作原理 HTTP协议是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP是基于TCP/IP协议来传递数据的(HTML文件、图片、查询结果等),HTTP协议不涉及数据包(Packet)传输,主要规定了…...
Spring 整合mybatis
目录 1、梳理整合思路 2、整合实现 2.1 环境搭建 2.2 案例 1、梳理整合思路 将MyBatis的DataSource交给Spring IoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数据库连接池将MyBatis的SqlSessionFactory交给Spring IoC容…...
centos7升级openssl_3
1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
