当前位置: 首页 > 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、多巴胺等…...

linux arm系统烧录

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

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

GeoServer发布PostgreSQL图层后WFS查询无主键字段

在使用 GeoServer&#xff08;版本 2.22.2&#xff09; 发布 PostgreSQL&#xff08;PostGIS&#xff09;中的表为地图服务时&#xff0c;常常会遇到一个小问题&#xff1a; WFS 查询中&#xff0c;主键字段&#xff08;如 id&#xff09;莫名其妙地消失了&#xff01; 即使你在…...