多线程部分面试题整理

并行和并发

并发:指两个或多个事件在同一个时间段内发生。(单核)
并行:指两个或多个事件在同一时刻发生(同时发生,多核)

自定义线程的方式

创建线程方式有四种:
继承Thread类,重写run方法
实现Runnable接口,实现run方法
实现Callable接口,通过包装器FutrueTask创建线程(有返回值)
线程池创建

线程的生命周期

新建(NEW),就绪(Runnable),运行(Running),阻塞(Blocked)(又分为 Blocked,waiting,time-waiting),死亡(Dead/TERMINATED)

线程的常见方法

sleep(): 每一个对象都有一个锁,sleep不会释放锁,使线程停止运行一段时间,将处于阻塞状态,如果调用了sleep方法之后,没有其他等待执行的线程,这个时候当前线程不会马上恢复执行!线程由运行状态进入阻塞状态,时间一到,再回到预备状态,等待CPU的重新调度。

join(): join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞

yield(): 线程直接由运行状态跳回预备状态。让当前正在执行线程暂停,不是阻塞线程,而是将线程转入就绪状态。调用了yield方法之后,如果没有其他等待执行的线程,此时当前线程就会马上恢复执行!

setDaemon(): 线程分为用户线程和守护线程。虚拟机必须确保用户线程执行完毕。虚拟机不用等待守护线程执行完毕,如后台记录操作日志、监控内存使用等。
1.可以将指定的线程设置成后台线程,守护线程
2.创建用户线程的线程结束时,后台线程也随之消亡
3.只能在线程启动之前把它设为后台线程

setPriority(): 线程的优先级代表的是概率,范围从1到10,默认为5。Java提供:一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。

如何保证线程的执行顺序

方案一:使用join()方法
方案二:单线程线程池

守护线程和用户线程

在 Java 中通常有两种线程:守护线程(Daemon Thread)和用户线程(User Thread)。

守护线程:如果只剩下守护线程未离开,JVM是可以离开的,守护线程是JVM中所有用户线程的保姆。,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT 线程都是守护线程

用户线程:当存在任何一个用户线程未离开,JVM是不会离开的。可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如我们使用 Thread 创建的线程在默认情况下都属于用户线程

sleep和wait的区别

1,这两个方法来自不同的类:wait是Object下的方法和sleep是Thread下的方法。
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

run和start的区别

start()
用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。

run()
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

区别
1、线程中的start()方法和run()方法的主要区别在于,当程序调用start()方法,将会创建一个新线程去执行run()方法中的代码。但是如果直接调用run()方法的话,会直接在当前线程中执行run()中的代码,注意,这里不会创建新线程。这样run()就像一个普通方法一样。

2、另外当一个线程启动之后,不能重复调用start(),否则会报IllegalStateException异常。但是可以重复调用run()方法。

总结起来就是run()就是一个普通的方法,而start()会创建一个新线程去执行run()的代码。

如何保证线程安全

1.Confinement
限制数据共享。
将可变数据限制在单一线程内部,避免竞争。核心思想就是线程之间不共享可变数据类型。
2.Immutable
将可变数据类型改为Immutable类型。
避免多线程间的race condition。
3.Threadsafe data type
共享线程安全的可变数据。
如果必须要在多线程间使用mutable的数据类型,必须要使用线程安全的数据类型。在JDK的类文档中,记录着是否线程安全。如List,Set,Map等集合类,都是线程不安全的。
4.Synchronization
通过锁的机制共享不安全的可变数据。

常见的线程池有哪些

1.单线程线程池
2.固定大小的线程池(核心线程数=最大线程数)
3.可缓存的线程池
4.可定时和周期执行任务的线程池

如何自定义线程池 —

1.使用ThreadPoolExecutor创建线程池。
2.通过实现 ThreadFactory 接口,实现自定义线池创建工厂。
3.通过实现 RejectedExecutionHandler 接口,实现自定义线程池拒绝策略。

自定义线程池的七大参数 —

1、corePoolSize:核心线程数,线程池中最少线程,核心线程不会被回收。

2、maximumPoolSize:最大线程数,线程池中最多线程,包含核心线程数,不能小于核心线程数。

3、keepAliveTime:非核心线程(除去核心线程之外的线程)存活时间,如果非核心线程的空闲时间大于此参数,将会被回收。

4、TimeUnit:时间单位,参数keepAliveTime的时间单位。

5、BlockingQueue:阻塞工作队列,当来一个新的线程任务时,如果当前没有空闲线程,此线程任务将会进入阻塞工作队列中进行等待。

6、ThreadFactory:线程工厂,用于创建线程,自定义线程的名称。(需要实现ThreadFactory接口,实现newThread()方法,在此方法中,新建Thread对象,通过调用setName()方法给线程定义名称。)

7、RejectedExecutionHandler:拒绝策略,当线程池中没有空闲线程,且阻塞工作队列已满,且最大线程数也已超出,此时再来线程任务将执行拒绝策略。

有四种拒绝策略:第一种:AbortPolicy,丢弃任务并且抛出异常(默认方式)。第二种:DiscardPolicy,丢弃任务不抛异常。第三种:DiscardOldestPolicy,将阻塞工作队列中的队头任务丢弃,将当前任务加入阻塞工作队列。第四种:CallerRunsPolicy,谁调用谁处理。

线程在线程池中的执行流程 —

1.在向线程池提交任务时,判断是否存在空闲线程
空闲线程存在,分配空闲线程,执行该线程

2.空闲线程不存在,判断已有线程是否超出设置的核心线程数
核心线程数未超出,创建新的核心线程去执行该线程任务
已超出,判断任务队列是否已满

3.任务队列未满,将该线程任务放入工作队列中等待,等有其他线程执行任务后,归还线程,工作队列中的任务依次出队,获取空闲线程,执行线程任务

4.任务队列满,判断是否超出最大线程数
最大线程数未超出,创建非核心线程,执行线程任务,该线程执行完任务,空闲的时间超出指定时间后将被回收

5.已超出,执行拒绝策略

常见拒绝策略

1 ThreadPoolExecutor.AbortPolicy 默认拒绝策略,拒绝任务并抛出任务
2 ThreadPoolExecutor.CallerRunsPolicy 使用调用线程直接运行任务
3 ThreadPoolExecutor.DiscardPolicy 直接拒绝任务,不抛出错误
4 ThreadPoolExecutor.DiscardOldestPolicy 触发拒绝策略,只要还有任务新增,一直会丢弃阻塞队列的最老的任务,并将新的任务加入

ThreadLocal – 频率不高

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。
ThreadLocal 适用于如下两种场景
1、每个线程需要有自己单独的实例
2、实例需要在多个方法中共享,但不希望被多线程共享

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

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

相关文章

django orm 查询返回指定关键字

django orm 查询返回指定关键字 在Django ORM中,可以使用以下方式查询并返回指定的关键字 使用 values() 方法: # 查询并返回 name 和 email 字段 results MyModel.objects.values(name, email)这将返回一个包含 name 和 email 字段的 QuerySet 对象。每个结果都是一个字典…

web前端设计nav:深入探索导航栏设计的艺术与技术

web前端设计nav:深入探索导航栏设计的艺术与技术 在web前端设计中,导航栏(nav)扮演着至关重要的角色,它不仅是用户浏览网站的指引,更是网站整体设计的点睛之笔。本文将从四个方面、五个方面、六个方面和七…

通用VS垂直,谁将领跑?

AI大模型的战场分化:通用VS垂直,谁能率先领跑? 在当前的AI大模型领域,一场激烈的竞争正在上演。通用大模型和垂直大模型在落地场景上的优劣各有千秋,究竟谁能在这一竞争中率先领跑呢? 首先,通用…

数据库的性能监控和调优工具

数据库的性能监控和调优是确保数据库高效、稳定运行的关键环节。以下是关于数据库性能监控和调优工具的清晰归纳: 1. 开源免费数据库监控工具 Netdata:一个开源的数据库、系统、容器和应用程序监控项目,能够收集指标,并将信息美…

Github 2024-06-12 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10PHP项目1PLpgSQL项目1C++项目1Ventoy: 100%开源的可启动USB解决方案 创建周期:1534 天开发语言:C协议类型:GNU General Public Licen…

2024年7款硬盘恢复软件:即刻恢复硬盘删除的文件!

当文件被删除后,它并不是立即从硬盘中消失,而是被标记为“已删除”,等待垃圾回收处理。因此,在文件被删除后,有几种方法可以尝试恢复删除的数据。 以下是7款常用的数据恢复软件,以及它们的详细介绍&#xf…

单片机与DHT11温湿度检测设计

本次设计是采用STC89C54单片机加上低成本的温湿度模块DHT11构成的温湿度检测系统。设计主要由硬件与软件两部分设计构成。硬件方面包括单片机STC89C54、温湿度模块DHT11、显示模块LCD1602、电池电源、I2C存储器以及控制按键等5个部分。此系统完全基于单片机最小系统并进行一定的…

【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-16 0…

Electron+vite+vuetify项目搭建

最近想用Electron来进行跨平台的桌面应用开发。同时想用vuetify作为组件,于是想搭建一个这样的开发环境。其中踩了不少坑,总是会出现各种的编译错误和问题,依赖的各种问题,搞了好久最终环境终于弄好可正常开发了。这里分享下快速搭…

前端面试题日常练-day71 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末 好的,以下是另外五个与Sass相关的选择题: Sass中,以下哪个符号用于声明一个变量? a) $ b) c) # d) & 在Sass中,以下哪个符号用于引入…

践行国产化替代,优刻得私有云勇当先锋

编辑:阿冒 设计:沐由 阳泉,十万火急! 位于太行山西麓的山西省阳泉市,是一座历史悠久、底蕴深厚、资源丰富的名城,拥有超百万常住人口,国内生产总值在2022年成功跨越千亿元大关。然而&#xff0c…

「C系列」C 共用体

文章目录 一、C 共用体1. 定义共用体2. 初始化共用体变量3. 访问共用体成员4. 共用体的用途 二、C 共用体常见问题1. 内存覆盖问题2. 类型混淆3. 初始化问题4. 跨平台兼容性问题5. 逻辑错误 三、相关链接 一、C 共用体 在C语言中,共用体(union&#xff…

RocketMQ源码学习笔记:源码启动NameServer,Broker

这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、NameServer2.1、源码启动NameServer 3、Broker启动过程 1、Overview 这篇文章的源码的版本是release-4.9.8。在启动各个模块之前应该先对项目进行打包mvn install -Dmaven.te…

OS复习笔记ch9-1

单处理器调度 调度类型 主要类型 长程调度:决定将哪个进程放入进程池中 中程调度:决定将哪些进程部分或者全部放入内存中 短程调度:决定哪个空闲进程上处理机 I/O调度:决定哪个进程的I/O请求被可用的I/O设备处理 处理器调度和进…

HTML中的<img>标签使用指南

在HTML中&#xff0c;<img>标签用于嵌入图片。它是一个自闭合标签&#xff0c;意味着它没有结束标签。<img>标签的属性可以控制图片的显示方式和来源。以下是<img>标签的使用和属性的详细介绍。 <img>标签的基本用法 基本的<img>标签只需要src…

jupyter notebook中使用不同的anaconda环境及常用conda命令

conda命令 在jupyter notebook中使用不同的anaconda环境其他常用conda命令 在jupyter notebook中使用不同的anaconda环境 创建环境 myenvname 需替换为自己的环境名称 conda create --name myenvname python3.7激活环境 conda activate myenvname 在该环境中安装Jupyter N…

java8 树类型转换

/*** 创建树** param list 列表* param parentRoot 父根* return {link List}<{link TreeLabelDto}>*/ public static List<TreeLabelDto> createTree(List<TreeLabelDto> list, String parentRoot) {Map<String, List<TreeLabelDto>> roo…

springboot原理篇-springboot

springboot原理篇-springboot&#xff08;三&#xff09; 一、起步依赖 虽然我是直接学习springboot的&#xff0c;没有经历过使用spring开发&#xff0c;但是鉴于我还学习了c,对依赖这方面真的一言难尽&#xff01;springboot起步依赖解决依赖问题我实在是羡慕&#xff01; 直…

第 18章 安全架构设计理论与实践

安全架构是架构面向安全性方向上的一种细分&#xff0c;可关注三个安全方面&#xff0c;即产品安全架构、安全技术体系架构和审计架构&#xff0c;这三个方面可组成三道安全防线。本章主要分析安全威胁、介绍安全模型&#xff0c;在此基础上&#xff0c;就系统、信息、网络和数…

mac m芯片安装win11遇坑

mac m芯片安装win11遇坑 1、下载arm架构镜像 磁力链接&#xff1a; magnet:?xturn:btih:e8c15208116083660709eac9aee124e025c01447&dnSW_DVD9_Win_Pro_11_22H2_64ARM_ChnSimp_Pro_Ent_EDU_N_MLF_X23-12755.ISO&xl57198960642、使用VMWare Fusion安装&#xff0c;启…