关于并发十道常见面试题

news/2024/7/27 20:55:35/文章来源:https://blog.csdn.net/loss_rose777/article/details/135621040

面试题一:线程中的start和run方法有什么区别

Java中线程是通过Thread类来实现的,每个线程都是通过特定的Thread对象所对应的run方法来完成

  1. start()方法来启动线程,真正的实现多线程,这时无需等待run()方法体代码执行完成,可以直接继续执行下面的代码,通过Thread类的start()方法来实现一个线程,这是此线程是处于就绪状态的,并没有运行,然后通过Thread类调用run()方法来完成运行操作
  2. run() 方法当作普通方法的方式调用。程序还是要顺序执行,要等待 run 方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

而start和run的区别可以比作汽车的钥匙和引擎,如果你没有钥匙的话就不会启动汽车

想要分清他们的区别还是要看代码更加直观:

可以看到run并没有创建线程,start创建了一个线程

面试题二:线程是如何通讯的?它的通讯方法有哪些?(说出你知道的所有通讯方法)

首先线程间的通信是指等多个线程之间操作同一份数据的时候,互相告知对方自己的状态,避免对同一变量进行争夺

在 Java 中,线程通讯的实现方法主要有以下几种:

  1. Object 类下的 wait()、notify() 和 notifyAll() 方法。
  2. Condition 类下的 await()、signal() 和 signalAll() 方法。
  3. LockSupport 类下的 park() 和 unpark() 方法。

Object 类下的 wait()、notify() 和 notifyAll() 方法:

wait():会让当前线程进入等待状态,并且释放所持有的锁

notify():随即唤醒一个等待该锁的其他线程,如果有多个线程都在等待这个对象的锁,这个方法只会唤醒其中一个线程。

notifyAll():这个方法会唤醒所有正在等待这个对象的锁的线程。

Condition 类下的 await()、signal() 和 signalAll() 方法

分别对应上述的wait、notify、notifyAll

LockSupport 类下的 park() 和 unpark() 方法

park():这方法会让当前线程进入等待,如果调用unpark()方法或者被线程终端,那么这个线程就i可以从park()方法返回

unpark(Thread thread):这个方法会让执行线程从park()方法返回

面试题三:说一下线程的生命周期

线程的生命周期主要分为五个阶段,NEW、RUNNABLE、BLOCAKED、WAITING、TIMED_WAITING、TERMINATED

  1. NEW(新建状态):new Thread() 时线程的状态。
  2. RUNNABLE(可运行/运行状态):调用 start() 方法后的状态。
  3. BLOCKED(阻塞状态):调用了 synchronized 加锁之后的状态。获得锁之后就从 BLOCKED 状态变成了 RUNNABLE 状态。
  4. WAITING(无时限等待状态):调用了 wait() 方法之后会进入此状态。
  5. TIMED_WAITING(有时限等待状态):调用了 sleep(long millis) 方法之后会进入此状态。
  6. TERMINATED(终止状态):线程任务执行完成之后就变成此状态。

面试题四:如何停止线程

自定义标识符:如定义一个flag变量true继续false退出

使用interrupt()方法:interrupt方法可以用来中断线程,但是并不会停止线程。它只是给线程设置一个中断标志。线程需要检查这个标志,然后决定是否停止执行。

使用stop()方法(已经放弃使用了不安全)

面试题五:wait()方法和sleep()方法有什么区别?

Wait和sleep都是可以用来暂停当前线程的执行,但是他们还是有一定区别:

  1. 所属类:wait是Object类中的,sleep是Thread类中的
  2. 锁处理:当线程执行wait时,会释放它当前持有的对象锁,进入等待状态。而执行sleep的时候不会释放锁
  3. 使用方式:wait必须在同步块或者同步方法(即synchronized)中调用,sleep任何地方都可以调用
  4. 使用场景:wait主要用于线程间通信,sleep用于暂停执行

面试题六:线程池相比于线程有什么优点?

线程池是一种管理和复用线程的机制,他预先创建一组线程,并且维护一个任务队列,当任务来的时候,会从线程池中选择线程去执行任务,而不是直接去创建一个线程。

线程池是一种管理和复用线程的机制,优点有以下几种:

  1. 线程重用(减低资源消耗):线程池可以重复利用已创建的线程,可以降低线程创建和销毁造成的消耗
  2. 提高响应速度:当任务到达的时候,如果线程池中有空闲的线程,那么这个任务可以立即得到执行,而不需要等待线程的创建
  3. 提供更强大的功能:线程池具备可拓展性,允许开大人员向其增加更多的功能。例如线程池的任务队列,使用任务队列可以存储更多的待执行的任务
  4. 提高系统的稳定性:线程池可以限制并发线程的数量,避免系统因为线程过多而导致资源耗尽或系统奔溃

面试题七:说下线程池创建参数都有哪些?它们都有哪些含义?

在Java中线程池是由ThreadPoolexecutor类实现的,其有多个参数:

  1. corePoolSize(核心线程数):这是线程池中能够同时执行线程的数量。即使线程处于空闲状态,核心线程也不会销毁
  2. maximumPoolSize(最大线程数):当任务队列已满且核心线程数以达到上限时,线程池会创建新的线程,直到达到最大线程数。
  3. keepAliveTime(空闲线程最大存活时间):当线程池中的线程数量大于核心线程且处于空闲的状态,那么在指定时间后,这个空闲线程就会被销毁
  4. unit(空闲线程存活时间单位):通常TimeUnit.SECONDS秒级。
  5. workQueue(工作队列):新任务提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。JDK提供四种任务队列:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue和PriorityBlockingQueue
  • ArrayBlockingQueue:基于数组的有界阻塞队列,按照FIFO(先进先出)排序,新任务进来后会放到队尾,有界的数组可以防止资源耗尽问题。达能线程池中的线程数量达到了corePoolSize后再有新任务到来,则会将任务梵高该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。
  • LinkedBlockingQueue:基于链表的无界阻塞队列(其实最大容量为Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而基本不会去创建新线程直到maxPoolSize(很难达到Interger.MAX这个数),因此使用该工作队列时,参数maxPoolSize其实是不起作用的。
  • SynchronousQueue:一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略
  • PriorityBlockingQueue:具有优先级的无界阻塞队列,优先级通过参数Comparator实现。

  1. threadFactory(线程工厂):可以用来设定线程名,是否为daemon(守护线程)线程
  2. handler(拒绝策略):这是当工作队列达到了最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交过来,该如何处理。JDK提供了四种拒绝策略CallerRunsPolicy、AbortPolicy、DiscarPolicy和DiscardOldestPolicy
  • CallerRunsPolicy:在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务
  • AbortPolicy:直接丢弃任务,抛出RejectedExecutionException异常
  • DiscarPolicy:直接抛弃任务,什么也不做
  • DiscarPolicy:抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列

面试题八:线程工厂有什么用?不设置线程工厂会怎样?

在Java中线程工厂是一个接口,主要用于创建新的线程,它通常与线程池一起使用,主要用于控制创建新线程时的一些行为,比如设置线程的优先级、名称等

如果在创建线程池的时候没有设置线程工厂,那么线程池会使用默认的线程工厂,默认的线程工厂会创建一个线程,为欸其设置线程池编号和线程编号组成的名称,设置它的优先级为正常优先级,且不是守护线程

面试题九:线程的优先级有什么用?如何设置线程池的优先级?

线程的优先级用证书表示,范围是1-10,数字越大优先级越高,线程的默认优先级为5

线程的优先级越高,表示它在竞争 CPU 资源时更有可能被调度执行。然而,线程优先级的具体行为在不同的操作系统和 Java 虚拟机实现中可能会有所不同。所以,线程优先级仅仅是给操作系统一个提示,告诉它应该优先调度哪个线程,但操作系统可能不会严格按照优先级来调度线程。

Java 中,线程的优先级由 Thread 类的 setPriority() 和 getPriority() 方法来设置和获取线程的优先级。

面试题十:说一下线程池的执行流程

线程池执行流程主要包括以下几个步骤:

  1. 提交任务:当提交一个任务到线程池的时候,线程池首先会判断核心线程池的线程是都都在执行任务,如果没有,则会创建一个新的工作来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程
  2. 等待队列:线程池会判断等待队列是否已经满,如果没有满,则添加任务到等待队列中,如果满了,则进入下一个流程
  3. 非核心线程:线程池会尝试创建一个非核心的线程来执行任务,如果创建失败(达到最大线程数),则会拒绝任务
  4. 执行任务:线程池中的线程(无论是核心线程还是非核心线程)会执行任务,执行任务可能是新提交的任务,也可能是等待队列中的任务

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

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

相关文章

华为交换机配置NQA TCP检测IP网络响应时间

微思 | 华为HCIA试听课程:网络工程师的基本功:网络地址转换NAT 微思 | 华为HCIP试听课程:华为HCIP必考题:DHCP协议原理与配置 组网需求 如图1所示,总部和子公司之间需要跨越外部网络进行通信,DeviceA和De…

【学习iOS高质量开发】——熟悉Objective-C

文章目录 一、Objective-C的起源1.OC和其它面向对象语言2.OC和C语言3.要点 二、在类的头文件中尽量少引用其他头文件1.OC的文件2.向前声明的好处3.如何正确引入头文件4.要点 三、多用字面量语法,少用与之等价的方法1.何为字面量语法2.字面数值3.字面量数组4.字面量字…

Apache DolphinScheduler 3.1.8 保姆级教程【安装、介绍、项目运用、邮箱预警设置】轻松拿捏!

概述 Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应…

浏览器网页内嵌Qt-C++音视频播放器的实现,支持软硬解码,支持音频,支持录像截图,支持多路播放等,提供源码工程下载

一.前言 在浏览器中实现播放RTSP实时视频流,⼤体上有如下⼏个⽅案: ⽅案一:浏览器插件⽅案 ActiveX、NPAPI、PPAPI ActiveX插件适用于IE浏览器,NPAPI与PPAPI插件适用于谷歌浏览器,不过这些插件都已经不被浏览器所支持…

HashData湖仓一体方案:方案概览与Hive数据同步

随着云计算、大数据、AI的发展和普及,各行各业的业务场景日益复杂,数据呈现出大规模、多样性的特点,企业对数据仓库的需求也进一步拓展至对多元化数据实时处理的场景。 数据湖是多元数据存储与使用的便捷选择,而云原生具有数据资…

GBASE南大通用提问:如果程序检索到 NULL 值,该怎么办?

可在数据库中存储 NULL 值,但编程语言支持的数据类型不识别 NULL 状态。程序必须 采用某种方式来识别 NULL 项,以免将它作为数据来处理。 在 SQL API 中,指示符变量满足此需要。指示符变量是与可能收到 NULL 项的主变量相 关联的一个附加的变…

PHP面试小结(20240108)

PHP 部分 1. php的包管理工具是如何实现自动加载的 换句话问:composer 实现原理是什么?spl_autoload_register() 首先,Composer 是 PHP 的一个包管理和包依赖管理的工具 , 打开安装之后生成的 "vendor" 文件, 里面有个…

opencv_角点检测

文章内容 一个opencv检测角点的程序 运行效果 #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;void detectCorners(M…

uniapp中按钮点击跳转页面失效,纠正错误(亲测可用)

不知道伙伴你的错误和我是否一致&#xff1f; 我当时为了点击跳转按钮发现跳转不了&#xff0c;如下错误提示&#xff1a; worker.js?libNameWAAccelerateWorker.js:1 [Deprecation] SharedArrayBuffer will require cross-origin isolation as of M92, around July 2021. S…

Debian12 安装jenkins 公钥配置

jenkins公钥配置 参考&#xff1a;Debian Jenkins 软件包 这是 Jenkins 的 Debian 软件包存储库&#xff0c;用于自动安装和升级。 要使用此存储库&#xff0c;请先将密钥添加到您的系统&#xff08;对于每周发布行&#xff09;&#xff1a; sudo wget -O /usr/share/keyring…

36.有效的数独

36.有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图…

企业微信开发:自建应用:access_token

access_token 过期后接口响应 access_token 已经过期&#xff08;2小时&#xff09;后&#xff0c;调用接口的响应&#xff1b;本文中以发送消息接口为例&#xff0c;说明接口响应的情况。 官方开发文档链接&#xff1a;获取access_token access_token 过期后调用接口 响应体 …

2024年腾讯云主机价格表,附报价明细

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

机器学习小记——KNN(K近邻)

为了让绝大多数人都可以看懂&#xff0c;所以我就用简单的话语来讲解机器学习每一个算法 第一次写ML的博文&#xff0c;所以可能会有些地方出错&#xff0c;欢迎各位大佬提出意见或错误 祝大家开心进步每一天&#xff5e; 博文代码全部为python 简单的说一下什么是机器学习…

adb wifi 远程调试 安卓手机 命令

使用adb wifi 模式调试需要满足以下前提条件&#xff1a; 手机 和 PC 需要在同一局域网下。手机需要开启开发者模式&#xff0c;然后打开 USB 调试模式。 具体操作步骤如下&#xff1a; 将安卓手机通过 USB 线连接到 PC。&#xff08;连接的时候&#xff0c;会弹出请求&#x…

Android 系统启动过程纪要(基于Android 10)

前言 看过源码的都知道&#xff0c;Launcher系统启动都会经过这三个进程 init ->zygote -> system_server。今天我们就来讲解一下这三个进程以及Launcher系统启动。 init进程 准备Android虚拟机环境&#xff1a;创建和挂载系统文件目录&#xff1b;初始化属性服务&…

AI大模型预先学习笔记二:prompt提问大模型、langchain使用大模型框架、fine tune微调大模型

文章目录 一、Prompt Engineering&#xff08;怎么去提问大模型&#xff09;1&#xff09;环境准备2&#xff09;交互代码的参数备注3&#xff09;交互代码 二、LangChain&#xff08;一个框架去使用大模型&#xff09;1&#xff09;LangChain核心介绍&#xff1a;I/O模块、数据…

Java NIO (二)NIO Buffer类的重要方法

1 allocate()方法 在使用Buffer实例前&#xff0c;我们需要先获取Buffer子类的实例对象&#xff0c;并且分配内存空间。需要获取一个Buffer实例对象时&#xff0c;并不是使用子类的构造器来创建&#xff0c;而是调用子类的allocate()方法。 public class AllocateTest {static…

四、Sharding-JDBC系列04:分库分表后,如何不停机迁移数据?

目录 停机迁移方案 双写迁移方案 一般会有两种方案&#xff1a; 停机迁移方案 这种方案最简单也是最low的。 数据迁移前&#xff0c;在网站或者app挂个公告&#xff0c;说0点到早上6点系统进行维护&#xff0c;无法访问。 接着到0点停机&#xff0c;系统停掉&#xff0c;…

k8s---配置资源管理

目录 配置资源管理的方式 secret pod如何来引用secret&#xff1f;&#xff1f;&#xff1f; 陈述式创建&#xff1a; 声明式创建 Secret创建加密文件 使用token挂载 环境变量使用 docker-registry ConfigMap 陈述式 热更新 总结&#xff1a; 配置资源管理的方式 …