javaJUC基础
JUC基础知识
多线程
管程
Monitor,也就是平时所说的锁。Monitor其实是一种同步机制,它的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码块,JVM中同步是基于进入和退出监视器(Monitor管程对象)来实现,每个对象实例都会有一个Monitor对象,底层是由C++语言来实现。
-
补:Monitor对象并不会随着Java对象的销毁而销毁。
Java对象是在Java堆中创建的,而Monitor是与Java对象关联的、由JVM内部管理的机制。Monitor的创建和销毁并不直接对应于Java对象的创建和销毁。更确切地说,当Java对象被用作同步锁时,JVM会为该对象关联一个Monitor;而当该对象不再被用作同步锁,或者对象被垃圾回收时,与其关联的Monitor可能会被JVM内部释放或重新利用。
?:为什么是同步机制,不是互斥机制?
- 同步机制与互斥机制并不矛盾,同步机制包含了互斥以及协作
线程分类
用户线程
工作线程,完成业务操作
守护线程
一种特殊的为其它线程服务的线程,在后台默默完成一些系统性的任务(典型:垃圾回收线程)。做为一个服务线程,当服务对象没有了,就会伴随JVM一同结束工作。
?:怎么设置成守护线程?
Thread t = new Thread(() -> {});
t.setDaemon();
t.start();
/**
必须在start()开始前设置,不然会抛异常
*/
CompletableFuture
Future接口
Future是Java5新加的一个接口,它提供一种异步并行计算的功能,如果主线程需要执行一个很耗时的计算任务,我们会就可以通过Future把这个任务放进异步线程中执行,主线程继续处理其他任务或者先行结束,再通过Future获取计算结果
- 功能
定义操作异步任务执行的一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。
- 实现类 :FutureTask

FutureTask<String> futureTask = new FutureTask<>(() -> "Hello");
new Thread(futureTask).start();
try {System.out.println(futureTask.get());
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
}
- 优点
Future+线程池异步多线程任务配合,能显著提高程序的运行效率。
- 缺点
get()阻塞一旦调用get()方法求结果,一旦调用不见不散,非要等到结果才会离开,不管你是否计算完成,如果没有计算完成容易程序堵塞。
isDone()轮询轮询的方式会耗费无谓的cpu资源,而且也不见得能及时得到计算结果,如果想要异步获取结果,通常会以轮询的方式去获取结果,尽量不要阻塞。
FutureTask<String> futureTask = new FutureTask<>(() -> {TimeUnit.SECONDS.sleep(5);return "hello world"; });new Thread(futureTask).start();while (true) {if (futureTask.isDone()) {try {System.out.println(futureTask.get());return;} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}} else {try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("程序正在运行");} }
CompletableFuture 对 Future的改进
Future 在实际杂的任务中遇到了众多问题:
- 轮询耗时,不能回调
- 怎么更好与线程池组合使用
- 多个任务同步问题
在jdk8中出现了CompletableFuture
- 类架构

- 创建

- 回调
ExecutorService executorService = Executors.newFixedThreadPool(3);
CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName() + "---come in");int result = ThreadLocalRandom.current().nextInt(10);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}if (result > 5) { //模拟产生异常情况int i = 10 / 0;}System.out.println("----------1秒钟后出结果" + result);return result;
}, executorService).whenComplete((v, e) -> {if (e == null) {System.out.println("计算完成 更新系统" + v);}
}).exceptionally(e -> {e.printStackTrace();System.out.println("异常情况:" + e.getCause() + " " + e.getMessage());return null;
});
System.out.println(Thread.currentThread().getName() + "先去完成其他任务");
executorService.shutdown();
chain链式调用
@Accessors(chain = true)//开启链式调用
常用函数
-
get()
-
get(long timeout,TimeUnit unit)
-
join – 不抛异常
-
getNow() 完成返回正常值,否则备胎值
-
complate(T val) 是否打断get()直接返回val
-
thenApply() 计算存在依赖关系,串行化,且当前异常不进行下一步
-
handle() 存在依赖,串行化,异常也进行下一步
-
thenAccpt() 接受任务结果,不返回
-
thenRun() A执行完执行B,不需要A的结果
-
applyToEither() 谁快用谁
-
thenCombine 合并计算结果
线程池
如果没有传入自定义线程池,都用默认线程池ForkJoinPool
传入一个线程池,如果你执行第一个任务时,传入了一个自定义线程池
调用thenRun方法执行第二个任务时,则第二个任务和第一个任务时共用同一个线程池
调用thenRunAsync执行第二个任务时,则第一个任务使用的是你自定义的线程池,第二个任务使用的是ForkJoin线程池
备注:可能是线程处理太快,系统优化切换原则, 直接使用main线程处理,thenAccept和thenAcceptAsync,thenApply和thenApplyAsync等,之间的区别同理。
如何在Springboot如何在注册线程池呢?点击查看
相关文章:
javaJUC基础
JUC基础知识 多线程 管程 Monitor,也就是平时所说的锁。Monitor其实是一种同步机制,它的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码块,JVM中同步是基于进入和退出监视器(Monitor管程对…...
std::distance 函数介绍
std::distance 是 C 标准库中的一个函数模板,用于计算两个迭代器之间的距离。它的主要作用是返回从第一个迭代器到第二个迭代器之间的元素数量。这个函数对于不同类型的迭代器(如随机访问、双向、前向等)都能有效工作。 函数原型 template …...
如何在Windows和Linux之间实现粘贴复制
第一步 sudo apt-get autorremove open-vm-tools第二步 sudo apt-get update第三步 sudo apt-get install open-vm-tools-desktop第四步 一直按Y,希望执行 Y第四步 重启 reboot然后可以实现粘贴复制。...
【第十七章:Sentosa_DSML社区版-机器学习之异常检测】
【第十七章:Sentosa_DSML社区版-机器学习之异常检测】 机器学习异常检测是检测数据集中的异常数据的算子,一种高效的异常检测算法。它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根…...
【Vue】为什么 Vue 不使用 React 的分片更新?
第一,首先时间分片是为了解决 CPU 进行大量计算的问题,因为 React 本身架构的问题,在默认的情况下更新会进行很多的计算,就算使用 React 提供的性能优化 API,进行设置,也会因为开发者本身的问题,…...
大学生科技竞赛系统小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,主办方管理,公告栏管理,竞赛分类管理,竞赛信息管理,报名信息管理,竞赛成绩管理 微信端账号功能包括:系统首…...
什么是聚集索引?
什么是聚集索引? 1、聚集索引的特点2、如何确定聚集索引3、性能优势 💖The Begin💖点点关注,收藏不迷路💖 聚集索引是一种特殊的索引,它直接包含了表中的所有数据行。所以,通过聚集索引…...
Centos/fedora/openEuler 终端中文显示配置
注意:这里主要解决的是图形界面、远程登录界面的中文乱码问题 系统原生的终端(如虚拟机系统显示的终端),由于使用的是十分原始的 TTY 终端,使用点阵字体进行显示,点阵字体不支持中文,因此无法显…...
使用kaggle命令下载数据集和模型
点击用户头像,点击Settings: 找到API,点击create new token,将自动下载kaggle.json: 在用户目录下创建.kaggle文件夹,并将下载的kaggle.json文件移动到该文件夹: cd ~ mv Downloads/kaggle.j…...
生信初学者教程(十一):数据校正
介绍 批次效应在生物学数据分析中是一个普遍存在的问题,它指的是由于实验过程中非生物学因素(如样本处理时间、实验条件、测序平台等)的差异,导致实验结果中混入与研究目标不相关的变异。在比较对照组和实验组时,这些非生物学因素可能引入额外的噪声,影响对生物学问题真实…...
JS设计模式之桥接模式:搭建跨越维度的通路
引言 在软件开发中,我们经常遇到需要对不同的抽象类进行不同的实现的情况,而传统的对象嵌套并不是一个优雅且可扩展的解决方案,因此这正是桥接模式的用武之地。桥接模式通过将抽象与实现分离,使得它们可以独立变化,从…...
苹果电脑系统重磅更新——macOS Sequoia 15 系统 新功能一 览
有了 macoS Sequoia,你的工作效率将再次提升:快速调整桌面布局,一目了然地浏览网页重点,还可以通过无线镜像功能操控你的iPhone。 下面就来看看几项出色新功能,还有能够全面发挥这些功能的 App 和游戏。 macOS Sequo…...
DoppelGanger++:面向数据库重放的快速依赖关系图生成
doi:DoppelGanger: Towards Fast Dependency Graph Generation for Database Replay,点击前往 文章目录 1 简介2 架构概述3 依赖关系图3.1 符号和问题定义3.2 无 IT(k) 图3.3 无 OT 图表3.4 无 OTIT 图表3.5 无 IT[OT] 图表3.6 输出确定性保证 4 重复向后…...
Linux(含麒麟操作系统)如何实现多显示器屏幕采集录制
技术背景 在操作系统领域,很多核心技术掌握在国外企业手中。如果过度依赖国外技术,在国际形势变化、贸易摩擦等情况下,可能面临技术封锁和断供风险。开发国产操作系统可以降低这种风险,确保国家关键信息基础设施的稳定运行。在一…...
calibre-web默认左上角字体修改
calibre-web默认左上角字体修改 如图: 有些奇异,如果想变成正常的常规字体,需要修改: cps\static\css\style.css 下的代码: 默认是GrandHotel-Regular: 换成其他字体即可。其他字体在 calibre-web\cps\s…...
考研数据结构——C语言实现归并排序
包含头文件:程序首先包含了标准输入输出库stdio.h,以便使用printf等函数进行输入输出操作。 定义数组和数组大小:定义了一个宏N,其值为5,表示数组q的长度。数组q被初始化为{5, 3, 8, 4, 2},这是我们要排序…...
LDO功率管选取NMOS和PMOS区别
一、drop电压 LDO如果两个管子流过相同的电流, 假设将管子饱和并顶到接近线性区 NMOS的效率(VIN-VDSAT-VGS)/VIN PMOS的效率=(VIN-VDSAT)/VIN 根本原因是 nmos的gate电压比source高vth 如果输出电压(source)较高或者驱动电流要大,…...
【Linux】进程的标识符、状态(超详解)
目录 进程的概念 进程标识符PID 系统调用创建进程-fork初识 进程状态 R状态(运行状态) S,D状态(休眠状态) T,t状态 Z状态(僵尸进程) 孤儿进程 X状态(死亡状态&a…...
Elasticsearch 启动后在浏览器输入http://localhost:9200 访问失败
windows Elasticsearch 启动后在浏览器输入http://localhost:9200 访问失败 文章目录 前言本地下载安装了个elasticsearch,启动成功了,在本地访问http://localhost:9200 无法访问!!!难受了一下。 一、windows Elastics…...
javascript中new操作符的工作原理
在 JavaScript 中,new 操作符用于创建对象的实例。它可以让我们通过构造函数创建一个新的对象,并初始化该对象的属性和方法。尽管 new 操作符的使用很常见,但它在背后实际进行了几个步骤。下面详细解释 new 操作符具体做了哪些事情。 new 操…...
MetaGPT终极指南:5步开启AI驱动软件开发新时代
MetaGPT终极指南:5步开启AI驱动软件开发新时代 【免费下载链接】MetaGPT 🌟 The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming 项目地址: https://gitcode.com/GitHub_Trending/me/MetaGPT MetaGPT是…...
告别Swagger注解污染:用smart-doc + Maven插件5分钟生成整洁API文档(SpringBoot实战)
零侵入API文档革命:smart-doc在SpringBoot项目中的极致实践 如果你曾经被Swagger注解污染代码所困扰,或是厌倦了在业务逻辑中嵌入大量文档相关注解,那么smart-doc可能会成为你API文档管理的新选择。作为一款基于源码解析的文档生成工具&#…...
FPGA密码锁设计避坑指南:状态机划分、时序约束与安全逻辑的那些事儿
FPGA密码锁设计避坑指南:状态机划分、时序约束与安全逻辑的那些事儿 在FPGA开发领域,密码锁设计看似简单,实则暗藏玄机。许多工程师在完成基础功能后,往往会在状态机划分、时序约束和安全逻辑等环节踩坑。本文将结合实战经验&…...
掌握罗技鼠标宏的5个技术维度:从原理到实战优化
掌握罗技鼠标宏的5个技术维度:从原理到实战优化 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 一、技术原理解析:机械补…...
避坑指南:MoE训练中AllToAll通信的配置与性能调优(以DeepSpeed为例)
MoE训练实战:AllToAll通信性能调优与DeepSpeed配置避坑指南 当你在500张GPU的集群上启动MoE模型训练时,控制台突然刷出"AllToAll timeout"的红色警告——这不是假设场景,而是去年我们在训练千亿参数模型时真实遭遇的噩梦。AllToAll…...
用战神引擎开服后,别忘了这几步:服务器安全、日志监控与性能调优指南
战神引擎开服后的高阶运维指南:安全加固、日志监控与性能调优实战 当你成功用战神引擎架设传奇手游服务器后,真正的挑战才刚刚开始。服务器能跑起来只是第一步,如何让它跑得稳、跑得安全、跑得高效,才是区分普通服主和专业运维的关…...
stealth.js全解析:40+反检测补丁的配置与优化技巧
Stealth.js全解析:40反检测补丁的配置与优化技巧 在当今的Web自动化领域,反检测技术已成为开发者必须掌握的核心技能之一。无论是数据采集、自动化测试还是其他需要模拟真实用户行为的场景,如何让脚本"隐形"都是决定成败的关键因素…...
AMD显卡专属优化:Ollama-for-amd本地大模型部署终极指南
AMD显卡专属优化:Ollama-for-amd本地大模型部署终极指南 【免费下载链接】ollama-for-amd Get up and running with Llama 3, Mistral, Gemma, and other large language models.by adding more amd gpu support. 项目地址: https://gitcode.com/gh_mirrors/ol/ol…...
Lingbot-Depth-Pretrain-ViTL-14 在AIGC领域的应用:为AI生成图像添加深度信息
Lingbot-Depth-Pretrain-ViTL-14 在AIGC领域的应用:为AI生成图像添加深度信息 最近在玩AI生成图片,大家是不是也遇到过这样的困惑:用Stable Diffusion、Midjourney这些工具生成了特别棒的二维画面,但总觉得少了点什么?…...
MacOS/Linux双平台实测:Ollama一键部署千问大模型避坑指南(附WebUI汉化技巧)
MacOS/Linux双平台实测:Ollama一键部署千问大模型避坑指南(附WebUI汉化技巧) 在开源大模型生态中,Ollama凭借其轻量化部署能力成为开发者本地运行AI模型的首选工具。本文将基于MacOS(M系列芯片/Intel)和Lin…...
