线程并发库复习

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.mzph.cn/bicheng/43744.shtml

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

相关文章

MySQL GROUP_CONCAT 函数详解与实战应用

提示:在需要将多个值组合成一个列表时,GROUP_CONCAT() 函数为 MySQL 提供了一种强大的方式来处理数据 文章目录 前言什么是 GROUP_CONCAT()基本语法 示例使用 GROUP_CONCAT()去除重复值排序结果 前言 提示:这里可以添加本文要记录的大概内容…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在这个视觉内容至关重要的时代,16:9横屏视频因其宽广的画面和优越的观赏体验,已经成为无数创作者和营销专家的首选格式。但要创造出吸引人的横屏视频,高质量的视频素材库是不可或缺的。不管你是资深视频制作人还是刚入行的新手,下…

02day-C++学习(const 指针与引用的关系 inline nullptr)

02day-C学习 1. 使用const注意事项 注意事项 • 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。 • 不需要注意的是类似 int& rb a3; double d 1…

SVM - 径向基函数核 Radial Basis Function Kernel,简称RBF核或者高斯核

SVM - 径向基函数核 Radial Basis Function Kernel,简称RBF核或者高斯核 flyfish 径向基函数核(Radial Basis Function Kernel,简称RBF核),也称为高斯核,是一种常用的核函数,用于支持向量机&a…

2025考研~数据结构试卷

作者主页:知孤云出岫 数据结构试题 [TOC](数据结构试题)数据结构试卷一、选择题(每题2分,共20分)二、填空题(每题3分,共15分)三、简答题(每题10分,共40分)四…

15.分频器设计--偶分频

设计一个六分频时钟信号 (1)visio视图: (2)Verilog代码: module divider_six(clk,reset_n,clk_out);input clk;input reset_n;output reg clk_out;reg [1:0]cnt;//计数器模块设计 always(posedge clk o…

突破传统,实时语音技术的革命。Livekit 开源代理框架来袭

🚀 突破传统,实时语音技术的革命!Livekit 开源代理框架来袭! 在数字化时代,实时通信已成为我们日常生活的一部分。但你是否曾想象过,一个能够轻松处理音视频流的代理框架,会如何改变我们的沟通方式?今天,我们就来一探究竟! 🌟 什么是 Livekit 代理框架? Live…

大数据基础:Hadoop之HDFS重点架构原理

文章目录 Hadoop之HDFS重点架构原理 一、什么是Hadoop 二、HDFS简介 三、HDFS架构 3.1、NameNode 3.2、SecondaryNameNode 3.3、DataNode 3.4、Client 四、fsimage和editslog合并 五、Block副本放置策略 六、读写流程 6.1、HDFS写文件流程 6.2、HDFS读文件流程 Ha…

2024年7月1日,公布的OpenSSH的漏洞【CVE-2024-6387】

目录 ■概要 ■概要(日语) ■相关知识 openssh 和 ssh 有区别吗 如何查看 openssh的版本 漏洞描述 glibc Linux是什么 如何查看系统是不是基于 Gibc RHEL Linux 是基于Glibc的Linux吗 还有哪些 Linux版本是基于 GNU C库(glibc&…

JustAuth实现多个钉钉扫码登录

需求: 实现多个钉钉组织的用户绑定和扫码登录。 JustAuth框架实现钉钉扫码登录用到的dingTalk接口: https://oapi.dingtalk.com/connect/qrconnecthttps://oapi.dingtalk.com/connect/oauth2/sns_authorize根据sns临时授权码获取用户信息 https://oap…

Java基础之Stringjoiner

Stringjioiner的概述 StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。 Stringjoiner的构造方法 Stringjoiner…

软件许可证优化怎么做最好!

在当今数字化发展的浪潮中,软件许可证的优化成为了 IT 总监们面临的一项重要挑战。在许可数量受限的情况下,如何将现有许可发挥最大利用率,是一个亟待解决的问题。 信息采集是优化的基础。 我们需要采集关于软件使用频率、使用时长、用户部门…

05.C1W4.Machine Translation and Document Search

往期文章请点这里 目录 OverviewWhat you’ll be able to do!Learning Objectives Transforming word vectorsOverview of TranslationTransforming vectors Align word vectorsSolving for RFrobenius normFrobenius norm squaredGradient K nearest neighborsFinding the tr…

Sentinel-1 Level 1数据处理的详细算法定义(二)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

解决打印PDF文本不清楚的处理办法

之前打印PDF格式的电子书,不清晰,影响看书的心情,有时看到打印的书的质量,根本不想看,今天在打印一本页数不多,但PDF格式的书感觉也不太清楚,我想应该有办法解决,我使用的是解决福昕…

2017年,我成为了技术博主

2017年9月,我已经大三了。 >>上一篇(爪哇,我初窥门径) 我大二学了很多java技术,看似我一会就把javaweb/ssh/ssm这些技术栈给学了。 这些技术确实不难,即便是我,我都能学会,…

可以添加todo清单桌面小组件的便签哪个好?

在我们快节奏的生活中,有效的时间管理和任务追踪是必不可少的。为了实现这一目标,许多人选择使用桌面便签,尤其是那些具有Todo清单桌面小组件的便签。但是,面对市场上众多选择,可以添加todo清单桌面小组件的便签哪个好…

14 Portainer轻量级图形化监控

目录 Portainer:Docker轻量级可视化工具 1. 安装与访问 2. 使用 3. Portainer配置 nginx Portainer:Docker轻量级可视化工具 Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机…

db期末复习自用[应试向 附习题]

第一章 数据库系统实现整体数据的结构化,主要特征之一,是db区别于文件系统的本质区别。 数据库系统三个阶段:人工、文件、数据库系统。 数据库管理系统的功能:数据库定义、操纵 、(保护、存储、维护)、数…

Jmeter在信息头中设置Bearer与 token 的拼接值

思路:先获取token,将token设置成全局变量,再与Bearer拼接。 第一步:使用提取器将token值提取出来,使用setProperty函数将提取的token值设置成全局变量,在登录请求后面添加BeanShell取样器 或者 BeanShell后…