线程并发库复习

news2024/9/21 16:45:46

1.进行和线程

什么是进程:进程是内存分配的基本单位,它是程序执行时的一个实例,会被放到进程就绪队列,等进程调度器选择它,给它时间片,它才会运行。在java中启动进程,main,test,springboot,java-jar,都是启动一个进程。

什么是线程:线程是程序执行时的最小单位,进程由多个线程组成,线程间共享进程所有资源,每个线程有自己的栈和变量。多cpu运行多个线程同时运行,多线程可以实现并发操作,在web中每个请求分配一个线程来处理。每个请求一个线程

2.java使用线程常用四种方式

方式一:继承Tread,重写run方法,new Tread实例对象,start方法(严谨说法)

方式二:创建runnable接口实现类,覆写run方法,作为参数传入tread类,进行有参构造,调用start

方法三:实现callable,传给FutureTask

我记得好像还有用CompletableFuture,创建异步线程?

CompletableFuture的supplyAsync方法,提供了异步执行的功能,线程池也不用单独创建了。实际上,它CompletableFuture使用了默认线程池是ForkJoinPool.commonPool

方法四:调用线程池

ps:

main是一个线程,在main中new一个线程,相当于异步执行

new线程的时候并没有创建线程,而是调用start()以后,才会帮我们创建线程,并执行线程中的run方法。

调用start方法以后。线程并不是立刻执行,只有当cpu时间片轮换到它以后,线程才会被执行。

2.0.1调用start()以后,会去执行run()方法,为什么我们不直接调用run()?

star和run方法的区别

直接调run方法,在当前线程中同步执行该方法,就不是异步执行方法了。

start是另开一个线程,run方法是在本线程中同步执行该方法。

2.0.2如何区分这些线程,通过线程名称区分,线程名称默认Tread-x。你也可以自己取一个名字,可取可不取。tread.setName(“zzzz”)

2.1 实现runable方法,实现run方法,创建Tread实例对象,传入参数。

方法一和方法二的区别?

继承,实现,单继承,继承别的类,不可以。多实现,一个类可以实现多个接口,还可以继承某一个类。方法二更灵活。使用start以后都是调用都是run方法,调用重写过的run方法。

那为什么方法二调用的是runable的run方法不是tread的run方法?

同时tread 的 init方法的时候,把target传了过去,因为tread没有重写,所以target不为空,所以调用target的run方法。

匿名内部类也可以new tread,或者lamda表达式也可以。

2.3实现callable,callable可以有返回值,返回值通过FutureTask进行封装。类上的泛型就是我们返回值的类型。没有获取返回值是异步,获取返回值就变成同步了,还是异步吗?算的上异步,因为是在主线程中获取值,其实在另外一个线程中,早就跑完了,只是获取值而已。在它获取到值之前,都是异步的。

2.4线程池

创建就两种,具体写的方式四种就是上面四种。

3线程的生命周期

ps:vue的钩子函数,vue生命周期,vue的钩子函数不等于vue生命周期,正在vue生命周期中,自动触发的八个钩子函数

3.1生命周期图

3.2线程的方法

new新建状态,Rybbavl就绪状态,等待时间片,running运行中状态,run方法结束,线程销毁(死亡状态)。

3.3线程的状态

新建状态,就绪状态,运行状态,阻塞状态(睡眠或者挂起),死亡状态

3.4线程方法

yled:执行变就绪,让出cpu,不会释放锁(线程锁)

sleep:执行的线程睡眠,时间到,返回到可运行状态,会让出cpu,不会放弃锁资源。

join:通常用在主线程中,等待其他线程完成再结束main主线,会让出cpu,不会放弃锁资源

wait:强制当前正在执行的线程等待,直到被唤醒,返回可执行状态。让出cpu,会放弃锁资源。(通过notifu或者notifyall才会激活)

deamon:守护线程

除了wait,会让锁,其他都不让锁。

3.5线程通信

notify,notifyall,wait,通过某种机制交互,等待通知就是之一。

还有其他的通信方式哈

notify:只通知一个,随机选一个,多选一

notifyall:对象上所以线程全部被唤醒

4.线程池

为什么要使用线程池?

假如100万请求,创建100次线程,创建线程过多,导致内存不足,服务器崩溃。

1.线程池里面1000个,一批批获取,服务器处理只有1000个线程,避免高并发,防止服务器过载。

2.创建销毁,频繁创建销毁,费时间费资源。线程池是提前创建好的线程,只需要分配,不需要销毁,放回线程池就可以了。对线程的复用,避免创建销毁线程。

3.管理线程生命周期

用户态和内核态(我也不咋懂)

创建和销毁涉及底层,就是内核态

4.1线程池的原理

七大参数

corePoolSize:核心线程数

workque:工作队列,超过核心线程数,任务进行队列排队

  1. SynchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务;

  2. LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;

  3. ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小

MaximumPoolSize:最大线程数(核心+非核心),非核心线程数用完之后达到空闲时间会被销毁。

Hander:拒绝策略,任务超过最大线程数+队列排队数,多出来的任务取决于Hander

KeepAliveTime: 非核心线程的最大空闲时间,到了这个空闲时间没被使用,非核心线程销毁

Unit: 空闲时间单位

ThreadFactory:使用ThreadFactory创建新线程。 推荐使用Executors.defaultThreadFactory

4个策略:

  1. AbortPolicy丢弃任务并抛出RejectedExecutionException异常;

  2. DiscardPolicy丢弃任务,但是不抛出异常;

  3. DiscardOldestPolicy丢弃队列最前面的任务,然后重新尝试执行任务;

  4. CallerRunsPolicy由调用线程处理该任务

4.2线程池使用流程,原理

4.3线程池的使用

Execuertors提供哪些方法创建线程池?

java里面有哪些常用线程池?

java有哪些线程池?

EXcutors提供的静态方法创建的

常用6种

一个单线程的线程池    newSingleThreadExecutor

最大线程数和核心线程数都是1,线程池中的线程不会被销毁

这个工作队列最大值就是Integer最大值,该工作队列遵循先进先出

一个固定长度的线程池     newCachedThreadPool

这个线程池中,都是核心线程,没有非核心线程,传入是几,核心和非核心都是一样。不会被销毁,工作队列大小没有限制,先进先出。

适用于长期任务,性能好很多,放入工作队列慢慢执行。

一个可以无限扩大(缓存)的线程池    newFixedThreadPool(int n)

没有核心线程,最大线程数是Integer的最大值,超过60s没有执行任务,就会销毁。sync:这个队列不保存任务,有新任务来,直接新建线程来执行。新任务到来时,有空闲就复用,没有就新建。执行短期异步的小程序或者负载轻的服务器。

带定时任务的线程池,框架底层会用到 ScheduledThreadPool

springboot中的schedule 底层就是springtask,启动类大注解,就可以开发spring task,在某一个定时任务的方法上打注解,定时执行。

固定速率和固定延迟时间有区别,一个不管线程内部任务,一个是任务结束时增加。

拥有多个任务队列(可窃取的线程池)的线程池  newWorkStealingPool(n)

工作窃取,先干完活,又帮别人干任务,从队列尾部来窃取。

Excutors自定义线程池

5.ThreadPoolExecutor重要方法

Execute 执行任务

submit 执行任务

shutdown 等任务执行完后才终止

shotduwnNow 立即执行,尝试打断任务

isTerminated 是否终止

6.线程池中的最大线程数

线程池中的数,有一个大概算法,cpu密集型应用,线程池大小设置为N+1,如果是io密集型:操作文件,线程池大小设置为2N+1.

io优化中,这样的估算公式可能更加合适,最佳线程数目 = 。。

线程等待时间占比例高,需要越多线程,根据上面预估一个值,然后配合测试,得到最佳线程数目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1911418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无标题】维度模型:

维度模型 基本概念维度模型中设计表主要分为2大类事实表维度表 基本概念 事实 :行为所产生的事情(数据) 维度:分析数据的角度(状态) 维度模型中设计表主要分为2大类 事实表:用于保存行为所产生…

实战 | YOLOv8使用TensorRT加速推理教程(步骤 + 代码)

导 读 本文主要介绍如何使用TensorRT加速YOLOv8模型推理的详细步骤与演示。 YOLOv8推理加速的方法有哪些? YOLOv8模型推理加速可以通过多种技术和方法实现,下面是一些主要的策略: 1. 模型结构优化 网络剪枝:移除模型中不重要的神经元或连接,减少模型复杂度。 模型精…

【通信协议】八、CDL(Caterpillar Data Link)协议解析

1、协议简介 CDL(Caterpillar Data Link)是caterpillar的通信协议,该品牌发动机ECM与各控制单元进行通信时,采用基于RS-485的物理层规范进行开发的CDL协议进行通信; 2、物理层 信号传输方式:差分信号(通过两条线的电压差识别逻辑0或逻辑1) 通信方式:半双工通信(只允…

iPhone短信被拉黑了怎么恢复?4步快速移除黑名单

在日常使用iPhone的过程中,可能会因为误操作或其他原因将某些联系人拉入黑名单,导致无法接收他们发送的短信。那么,iPhone短信被拉黑了怎么恢复? 其实,只需要简单的4步操作,就能快速将联系人移出黑名单&am…

Windows 安装 PyCharm

PyCharm下载 PyCharm官网:http://www.jetbrains.com/pycharm/download/ Professional 专业的,Community 社区,这里我们点击Community下的 DOWNLOAD下载。 PyCharm 安装使用 PyCharm是一种Python IDE,带有一整套可以帮助用户在使…

猎人维修大师免狗版

技术文档摘要 标题: 多功能维修工具集合概述 摘要: 本文档提供了一组多功能维修工具的概述,这些工具旨在为专业技术人员提供便利,以执行设备维修和软件解锁等任务。文档列出了各个工具的主要功能和应用场景。 关键词&#xff1…

【最新版】手把手Claude 3.5 Sonnet 详细步骤注册方法!

目录 01 Claude 3.5 Sonnet 是什么 02 Claude 3.5 Sonnet 注册方法 Step1:注册 Wildcard Step2:注册Claude3.5 Step3:接收并输入验证 03 使用Claude 3.5 Sonnet 04 升级Claude 3 Opus 05 结语 01 Claude 3.5 Sonnet 是什么 蛰伏了三…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【签名/验签介绍及算法规格】

签名/验签介绍及算法规格 为实现数据完整性保护和防抵赖,可使用生成/导入的密钥,对数据进行签名验签操作。 支持的算法 以下为密钥签名/验签支持的规格说明。 面向OpenHarmony的厂商适配密钥管理服务规格分为必选规格和可选规格。必选规格为所有厂商…

苍穹外卖--启用和禁用员工

实现 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.dto.EmployeePageQueryDTO; import com.sky.entity.Employee; import com.sky.properties.JwtPro…

赛力斯25亿收购华为“问界”商标,估值102亿!

近日赛力斯发布公告,拟收购华为持有的商标及知识产权,华为其下属企业持有的九百一十九项商标权,其中七百四十项商标权已获授权,剩余商标权正在申请中,尚未获得商标注册证书,持有的商标及知识产权无形资产评…

Skywork-MoE,1460亿MoE模型,采用MoE Upcycling技术

Skywork-MoE,1460亿MoE模型,采用MoE Upcycling技术 原创 每日发现最新LLM 机器之心SOTA模型 2024年06月04日 18:27 北京 🏆 基座模型 ①项目名称:Skywork-MoE ★Skywork-MoE是一款千亿模型,具有1460亿参数、16个专家…

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker-jdbc-xxljob

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解?Redis一般都有哪些使用的场景?Redis有哪些常见的功能?Redis支持的数据类型有哪些?Redis为什么这么快…

初识CPlusPlus

前言 也是好久没写博客了,那些天也没闲着,去练题去了。实际上练题也可以写练题的博客,但是觉得太简单了些,于是就没有继续写下去。如今又回来写博客,是因为有整理了新的知识C。内容不算多,大多数都是书本上…

评估测试用例有效性 5个方面

评估测试用例的有效性是确保软件测试活动能够达到预期目标的关键步骤,有助于测试团队优化测试计划,提高测试效率,减少返工,节省成本。如果缺乏对测试用例的有效性评估,可能会导致测试用例无法覆盖关键功能点&#xff0…

微服务 | Springboot整合Seata+Nacos实现分布式事务

1、分布式事务概念说明 分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如:用户注册…

一站式短视频矩阵开发,高效托管!

短视频矩阵系统源码SaaS解决方案提供全面的开发服务,包括可视化视频编辑、矩阵式内容分发托管以及集成的多功能开发支持。 短视频矩阵:引爆您的数字营销革命 短视频矩阵系统是一套多功能集成解决方案,专为提升在短视频平台上的内容创作、管理…

[C++] 由C语言过渡到C++的敲门砖

命名空间 在C/C中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染 。 在同一个工程中…

【matlab】周期性信号分析

目录 信号预处理 周期性特征提取方法 频谱分析 傅里叶变换 快速傅里叶变换(FFT) 周期图法 Welch法 自相关分析 时频分析 基于模型的方法 时间序列分解 应用实例 提取信号的周期性特征是一个在信号处理领域广泛应用的技术,特别是在…

深入解析【C++ list 容器】:高效数据管理的秘密武器

目录 1. list 的介绍及使用 1.1 list 的介绍 知识点: 小李的理解: 1.2 list 的使用 1.2.1 list 的构造 知识点: 小李的理解: 代码示例: 1.2.2 list 迭代器的使用 知识点: 小李的理解&#xff1…

了解Adam和RMSprop优化算法

优化算法是机器学习和深度学习模型训练中至关重要的部分。本文将详细介绍Adam(Adaptive Moment Estimation)和RMSprop(Root Mean Square Propagation)这两种常用的优化算法,包括它们的原理、公式和具体代码示例。 RMS…