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

java多线程学习笔记

文章目录

    • 关键词
    • 1.什么是多线程以及使用场景?
    • 2.并发与并行
    • 3.多线程实现
      • 3.1继承 Thread 类实现
      • 3.2Runnable 接口方式实现
      • 3.3Callable接口/Future接口实现
      • 3.4三种方式总结
    • 4.常见的成员方法(重点记忆)9
      • 4.1setName/currentThread/sleep要点
      • 4.2线程的优先级10档(priority)
      • 4.3守护/备胎线程(Daemon)
      • 4.4礼让/出让继承(yield又得)了解
      • 4.5插入线程(join)了解
    • 5.线程的生命周期
    • 6.线程的安全问题(synchronized)
      • 6.1产生的问题:
      • 6.2为什么产生:
      • 6.3解决方法:
        • 6.3.1同步代码块
        • 6.3.2同步方法
      • 6.4扩展
    • 7.lock锁(jdk5出现)
    • 8.死锁
    • 9.等待唤醒机制(生产者和消费者)
      • 9.1思路分析
      • 9.2常见方法(单个桌子实现)
      • 9.3吃货与桌子代码
      • 9.4厨师和main代码
      • 9.5阻塞队列实现
        • 厨师吃货类
        • 测试类
    • 10.java线程状态

关键词

3.1 Thread

3.2 Runnable

3.3 Callable/FutureTask

4 setName()、getName()、currentThread()、sleep()、

setPriority()、getPriority()、setDaemon()、yield()、join()

6 synchronized

7 static Lock lock = new ReentrantLock();

9.2 wait()、notify()、notifyAll()

9.5 ArrayBlockingQueue【put、take】、LinkedBlockQueue

1.什么是多线程以及使用场景?

应用软件种互相独立的,可以同时运行的功能,就形成了多线程

例子:360杀毒软件中,有木马查杀、电脑清理、系统修复、优化加速等可以同时运行的功能

场景:

1.拷贝迁移大文件的时候,多线程可以运行其他功能

2.加载大量资源文件,例如打开游戏时,加载资源文件,加载这些的同时,检查游戏版本,播放背景音乐

2.并发与并行

并发:同一时刻,多条指令在单个CPU交替执行

并行:同一时刻,多条指令在多个CPU同时执行

3.多线程实现

3.1继承 Thread 类实现

每一个创建出来的线程都是独立的,需要共享数据用static修饰常量

从这里可以看出代码是交替执行的(并发)

3.2Runnable 接口方式实现

由于是以参数的形式创建的线程,所以只会创建一次

3.3Callable接口/Future接口实现

3.4三种方式总结

前两种无法获取多线程运行的结果,由于重写的run方法是void,没有返回值,第三种有返回值

4.常见的成员方法(重点记忆)9

4.1setName/currentThread/sleep要点

4.2线程的优先级10档(priority)

关键词:抢占式调度(随机),非抢占式调度

优先级越高,抢到CPU执行权的(概率)越高

参考代码:

4.3守护/备胎线程(Daemon)

备胎线程陆续结束,不会全部执行完毕

应用场景

线程1聊天窗口,要是关闭了,那么线程2没有执行的必要了,所以线程2可以设置成守护线程

4.4礼让/出让继承(yield又得)了解

主要作用:让线程的执行尽可能均匀一点

4.5插入线程(join)了解

5.线程的生命周期

6.线程的安全问题(synchronized)

6.1产生的问题:

1.三个窗口买票共100张,看作三个线程,进行卖票,由于线程独立,导致卖了300张票

2.线程设置static修饰共享,可是依然会有超出范围的票和重复的票被卖出

6.2为什么产生:

**问题1:**例如,设置了sleep,在if条件中满足的都会进入执行代码,线程1执行了+1操作,刚到打印语句,线程2也执行了+1操作,此时,值就是2,那么线程1打印的值为2,线程2也是2

**问题2:**三个线程进入if的时候都满足条件,线程1为99时进入if,没有执行打印语句的时候,++就是100,此时,还没有打印,线程2进入++就是101,再线程3进入就是102

6.3解决方法:

6.3.1同步代码块

把操作共享的代码锁起来,也就是给代码块上锁

**细节1:**synchronzied要写在while里面,不然线程1抢到执行权,那么就会上锁,线程2 3无法执行,线程1解锁,那么100张票已经卖完

**细节2:**锁对象要是唯一的(Object,字节码对象),如果是两把不同的锁,A锁打开进入后关闭,线程1没有来就会一直锁着,线程2进不去,要是有B锁作为锁对象,那么B锁未被占用可以打开进入执行,那么上锁就没有意义了,eg:用this作为锁对象,那么锁就是不唯一的,

6.3.2同步方法

把synchronized关键字加到方法上,配合Runnable接口使用可以不考虑锁对象是否唯一

6.4扩展

StringBuilder:单线程使用,多线程不安全

StringBuffer:多线程使用,相比StringBuilder,该类的方法都是用synchronized进行了同步

7.lock锁(jdk5出现)

用于解决synchronized关键字不能手动枷锁的问题

标准写法

由于线程1执行到break会跳出循环,那么可定不会执行到释放锁的操作,那么线程永远不会停止,我们就可以将lock.unlock()写在finally方法体中,finally会在前面两个执行完成后执行,无论try是否抛出异常,或者catch是否捕获异常

8.死锁

操作系统学过,循环等待,不可剥夺,避免写这样的代码即可

9.等待唤醒机制(生产者和消费者)

9.1思路分析

9.2常见方法(单个桌子实现)

9.3吃货与桌子代码

9.4厨师和main代码

9.5阻塞队列实现

阻塞队列底层已经有锁,不需要再枷锁

厨师吃货类

测试类

10.java线程状态

是没有运行状态的,当线程抢到cpu执行权的时候,就会交给操作系统去管理,jvm就不管了

相关文章:

java多线程学习笔记

文章目录 关键词1.什么是多线程以及使用场景?2.并发与并行3.多线程实现3.1继承 Thread 类实现3.2Runnable 接口方式实现3.3Callable接口/Future接口实现3.4三种方式总结 4.常见的成员方法(重点记忆)94.1setName/currentThread/sleep要点4.2线程的优先级…...

Manticore Search,新一代搜索引擎之王

吊打ES,新一代搜索引擎之王 概述 Manticore Search 是一个开源的分布式搜索引擎,专注于高性能和低延迟的搜索场景。 它基于 Sphinx 搜索引擎开发,继承了 Sphinx 的高效索引和查询能力,并在分布式架构、实时搜索、易用性等方面进…...

【MySQL】数据类型与表约束

目录 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 字符串类型 日期和时间类型 enum和set 表的约束 空属性 默认值 列描述 zerofill 主键 自增长 唯一键 外键 数据类型分类 数值类型 tinyint类型 MySQL中,整形可以是有符号和无符号的&…...

CAG技术:提升LLM响应速度与质量

标题:CAG技术:提升LLM响应速度与质量 文章信息摘要: CAG(Cache-Augmented Generation)通过预加载相关知识到LLM的扩展上下文中,显著减少了检索延迟和错误,从而提升了响应速度和质量。与传统的R…...

上位机知识篇---Linux源码编译安装链接命令

文章目录 前言第一部分:Linux源码编译安装1. 安装编译工具2. 下载源代码3. 解压源代码4. 配置5. 编译6. 测试(可选)7. 安装8. 清理(可选)9.注意事项 第二部分:链接命令硬链接(Hard Link&#xf…...

科研绘图系列:R语言绘制线性回归连线图(line chart)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图保存图片系统信息参考介绍 科研绘图系列:R语言绘制线性回归连线图(line chart) 加载R包 library(tidyverse) library(ggthemes) libra…...

将ollama迁移到其他盘(eg:F盘)

文章目录 1.迁移ollama的安装目录2.修改环境变量3.验证 背景:在windows操作系统中进行操作 相关阅读 :本地部署deepseek模型步骤 1.迁移ollama的安装目录 因为ollama默认安装在C盘,所以只能安装好之后再进行手动迁移位置。 # 1.迁移Ollama可…...

Oracle 创建用户和表空间

Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…...

cursor ide配置远程ssh qt c++开发环境过程记录

cursor是啥就不介绍了,好像是目前最好用的ai ide,下面主要是配置远程ssh连接linux机器进行qt5 c程序运行的配置过程记录。 一、c_cpp_properties.json 在项目根目录的.vscode目录里面新建c_cpp_properties.json文件,根据你的实际情况配置该文…...

yolov5错误更改与相关参数详解(train.py)

1.错误更改 main中相关参数 if __name__ __main__:parser argparse.ArgumentParser()parser.add_argument(--weights, typestr, default, helpinitial weights path)parser.add_argument(--cfg, typestr, defaultmodels/yolov5s.yaml, helpmodel.yaml path)parser.add_arg…...

Python设计模式 - 组合模式

定义 组合模式(Composite Pattern) 是一种结构型设计模式,主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象,从而简化了客户端代码。 组合模式有透明组合…...

css粘性定位超出指定宽度失效问题

展示效果 解决办法&#xff1a;外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…...

Windows 程序设计6:错误码的查看

文章目录 前言一、说明二、使用GetLastError找到错误的原因三、使用错误码的宏总结 前言 Windows 程序设计6&#xff1a;错误码的查看。 一、说明 有时写的代码单纯看是没有问题的&#xff0c;但是执行起来就会崩溃。因此要养成判断函数执行是否成功的习惯&#xff0c;除非这…...

doris: CSV导入数据

本文介绍如何在 Doris 中导入 CSV 格式的数据文件。Doris 支持灵活的 CSV 格式配置&#xff0c;包括自定义分隔符、字段包围符等&#xff0c;并提供多种导入方式以满足不同场景的数据导入需求。 导入方式​ Doris 支持以下方式导入 CSV 格式数据&#xff1a; Stream LoadBro…...

FastStone Image Viewer图像处理软件安装步骤(百度网盘链接)

软件简介&#xff1a;一款小巧便捷的添加水印、特效、图片处理软件&#xff0c;让使用者可以通过它的操作界面来浏览图片&#xff0c;且还支持了幻灯播放的功能&#xff0c;让使用者能够轻松的浏览目录中的所有图片。 网盘链接&#xff1a;https://pan.baidu.com/s/1Zvrx7fXwb6…...

Kafka 深入服务端 — 时间轮

Kafka中存在大量的延迟操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器&#xff0c;来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能&#xff0c;因为它们的插入和…...

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志&#xff08;网络爬虫学习&#xff1a;应用selenium从搜…...

【go语言】结构体

一、type 关键字的用法 在 go 语言中&#xff0c;type 关键字用于定义新的类型&#xff0c;他可以用来定义基础类型、结构体类型、接口类型、函数类型等。通过 type 关键字&#xff0c;我们可以为现有类型创建新的类型别名或者自定义新的类型。 1.1 类型别名 使用 type 可以为…...

Spring Boot是什么及其优点

简介 Spring Boot是基于Spring框架开发的全新框架&#xff0c;其设计目的是简化Spring应用的初始化搭建和开发过程。 Spring Boot整合了许多框架和第三方库配置&#xff0c;几乎可以达到“开箱即用”。 优点 可快速构建独立的Spring应用。 直接嵌入Tomcat、Jetty和Underto…...

谷氨酸:大脑功能的多面手

标题&#xff1a;谷氨酸&#xff1a;大脑功能的多面手 文章信息摘要&#xff1a; 谷氨酸是大脑中最主要的兴奋性神经递质&#xff0c;参与了90%以上的神经元激活&#xff0c;在蛋白质合成、味觉&#xff08;鲜味&#xff09;以及神经可塑性中发挥重要作用。它与GABA、多巴胺等…...

SpringCloudGateWay和Sentinel结合做黑白名单来源控制

假设我们的分布式项目&#xff0c;admin是8087&#xff0c;gateway是8088&#xff0c;consumer是8086 我们一般的思路是我们的请求必须经过我们的网关8088然后网关转发到我们的分布式项目&#xff0c;那我要是没有处理我们绕过网关直接访问项目8087和8086不也是可以&#xff1…...

HTML新春烟花

系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心&#xff08;双心版&#xff09;10…...

【Elasticsearch】中数据流需要配置索引模板吗?

是的&#xff0c;数据流需要配置索引模板。在Elasticsearch中&#xff0c;数据流&#xff08;Data Streams&#xff09;是一种用于处理时间序列数据的高级结构&#xff0c;它背后由多个隐藏的索引组成&#xff0c;这些索引被称为后备索引&#xff08;Backing Indices&#xff0…...

Git进阶之旅:Git 配置信息 Config

Git 配置级别&#xff1a; 仓库级别&#xff1a;local [ 优先级最高 ]用户级别&#xff1a;global [ 优先级次之 ]系统级别&#xff1a;system [ 优先级最低 ] 配置文件位置&#xff1a; git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…...

buu-pwn1_sctf_2016-好久不见29

这个也是栈溢出&#xff0c;不一样的点是&#xff0c;有replace替换&#xff0c;要输入0x3c字符&#xff08;60&#xff09;&#xff0c;Iyou 所以&#xff0c;20个I就行&#xff0c;找后面函数 输出提示信息&#xff0c;要求用户输入关于自己的信息。 使用fgets函数从标准输入…...

ES2021+新特性、常用函数

一、ES2021新特性 ES2021 数字分隔符 let num 1234567 let num2 1_234_567 Promise.any 与 Promise.all 类似&#xff0c;Promise.any 也接受一个 Promise 的数组。当其中任何一个 Promise 完成&#xff08;fullfill&#xff09;时&#xff0c;就返回那个已经有完成值的 …...

STM32——LCD

一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然&#xff0c;后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...

【redis进阶】分布式锁

目录 一、什么是分布式锁 二、分布式锁的基础实现 三、引入过期时间 四、引入校验 id 五、引入lua 六、引入 watch dog (看门狗) 七、引入 Redlock 算法 八、其他功能 redis学习&#x1f973; 一、什么是分布式锁 在一个分布式的系统中&#xff0c;也会涉及到多个节点访问同一…...

园区管理系统如何提升企业核心竞争力与资产管理智能化水平

内容概要 在当今快节奏的商业环境中&#xff0c;园区管理系统正成为企业的重要合作伙伴&#xff0c;尤其在工业园、产业园、物流园、写字楼和公寓等多种类型的物业管理中。这个系统不仅仅是一个管理工具&#xff0c;它还是提升企业运营效率和核心竞争力的关键因素。通过智能化…...

AI大模型开发原理篇-3:词向量和词嵌入

简介 词向量是用于表示单词意义的向量&#xff0c; 并且还可以被认为是单词的特征向量或表示。 将单词映射到实向量的技术称为词嵌入。在实际应用中&#xff0c;词向量和词嵌入这两个重要的NLP术语通常可以互换使用。它们都表示将词汇表中的单词映射到固定大小的连续向量空间中…...