线程相关八股

1. 线程和进程的区别?

进程:进程可以简单理解为进行一个程序,比如说我们打开一个浏览器,打开一个文本,这就是开启了一个进程,一个进程想要在计算机中运行,需要将程序交给CPU,将数据存储在内存中,然后还要在内存和磁盘之间进行一些IO。所以进程就是用来加载指令、管理内存、管理IO的。

线程:线程就是一条条指令流,将这些指令交给CPU就是在运行该线程。一个进程可以有多个线程。

二者区别:进程就是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务;

                  不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间;

                  线程更轻量,线程上下文切换成本一般比进程要低。 

2. 并行和并发有什么区别?

在单核CPU下,线程实际上是串行执行的。一般会将这种线程轮流使用CPU的做法叫做并发(concurrent)。

在多核CPU下,每个核都可以调度运行线程,这时候线程可以是并行的。但是对于其中一个核来说,还是串行执行线程的。

并发指的是同一时间应对多件事情的能力;并行指的是同一时间动手做多件事情的能力。

在多核CPU下,并发是指多个线程轮流使用一个或者多个CPU;并行是同一时间动手做多件事情的能力,4核cpu同时处理4个线程。

3.  创建线程的方式有哪些?

继承Thread类,实现runnable接口,实现Callable接口,使用线程池创建线程(一般在项目中使用)。

那使用runnable和callable创建线程的区别是什么呢?

runnable接口的run方法是没有返回值的,而callable接口的call方法是有返回值的,是个泛型,和Future、FutureTask配合使用来获取异步执行的结果;callable接口的call方法允许抛出异常,而runnable接口的run方法的异常只能在内部进行消化即try...catch,不能继续上抛。

线程的run方法和start方法有什么区别?

start是用来启动线程的,通过该线程调用run方法执行run方法中的逻辑代码,start方法只能被调用一次,因为一个线程开启只能开启一次。

而run方法就是一个普通方法封装了代码逻辑,所以可以调用多次

4. 线程包括哪些状态,状态之间是如何变化的?

首先线程包含以下6种运行状态:NEW、RUNNABLE、TIMED_WAITING、WAITING、BLOCKED、TERMINATED。

状态之间的转换:首先,当一个线程被创建时,就为NEW状态,接着运行start方法,但这时CPU可能正在处理其他线程,所以暂时该线程没有执行权,直到抢到了CPU执行权,正常情况下就开始执行线程了,这个中间没有执行权的状态叫做RUNNABLE,当线程结束之后就会进入TERMINATED状态,死亡。以上是正常的执行情况,可能遇到一些异常情况,比如说当线程种使用了锁时,别的线程就拿不到锁,无法执行,进入BLOCKED阻塞状态,直到拿到锁。还有,当执行wait()方法时,线程就进入了WAITING等待状态,直到执行notify()方法,将其唤醒。还有一种是当前线程执行sleep(50)方法,就进入了TIMED_WAITING计时等待状态,等到时间了,就可以执行了。

5. 新建T1、T2、T3三个线程,如何保证他们按顺序执行?

可以使用线程中的join()方法等待线程结束。在如下的例子中,在t2中有一个方法是t1.join,意味着t2只有当t1运行结束之后才会执行,这样就能保证线程间按照顺序执行。

6. notify()和notifyAll()有什么区别?

notifyAll:唤醒所有wait的线程;

notify:只随机唤醒一个wait线程。

7. 在Java中wait和sleep方法的不同点?

共同点:wait()和sleep()的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态。

不同点:(1)方法归属不同:sleep是Thread的静态方法;而wait都是成员方法,每个对象都有。

(2)醒来时机不同:sleep和wait的线程都会在等待对应时间后醒来。wait还可以被notify唤醒,但是sleep不可以。他们都可以呗打断唤醒。

(3)锁特性不同:wait方法的调用必须先获取该对象的锁,而sleep不需要;wait方法执行后会释放锁,允许其他线程获取到该锁。而sleep如果在synchronized代码中执行,并不会释放对象的锁。

8. 如何停止一个正在运行的线程?

有三种方法可以停止线程:(1) 使用退出标志,使线程正常退出,也就是当run方法执行完后线程终止。(2) 使用stop方法强行终止,但是这种方法已经作废了。(3) 使用interrupt方法中断线程:如果打断阻塞的线程,比如说使用sleep,wait,join方法的线程,线程就会抛出interruptedException异常;如果打断正常的线程,可以根据打断状态来标记是否退出线程。

9. synchronized 关键字的底层原理?

synchronized

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

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

相关文章

Python 绘制迷宫游戏,自带最优解路线

1、需要安装pygame 2、上下左右移动,空格实现物体所在位置到终点的路线,会有虚线绘制。 import pygame import random import math# 迷宫单元格类 class Cell:def __init__(self, x, y):self.x xself.y yself.walls {top: True, right: True, botto…

【音视频】VLC播放器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、vlc是什么? VLC Media Player(简称VLC)是一款免费、开源、跨平台的多媒体播放器,由非营利组织VideoLAN开发,最…

vue2+ele-ui实践

前言:真理先于实践,实践发现真理,再实践检验真理 环境:vue2 & element-ui 正片: Select 选择器 简称 下拉框 下拉框完整的使用循环 下拉框 → 点击下拉框 → 展示数据 → 选择数据 → 下拉框显示数据 核心具有…

刷题日记——部分二分算法题目分享

前言 咱们紧跟上一期结合时间复杂度浅谈二分法的好处, 并分享部分二分题目(将持续更新题目,绝对值你一个收藏)-CSDN博客 笔者接着分享一些刷过的关于二分算法的题目. 第一题 1283. 使结果不超过阈值的最小除数 - 力扣(LeetCode) 这道题就是典型的二…

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…

关于常规模式下运行VScode无法正确执行“pwsh”问题

前言: pwsh在系统环境中正确配置,且可以运行在cmd, powshell(5.1)--- 都需要在管理员权限下运行 (打开setting) 打开setting.json (在vscode中添加 powershell 7 路径&…

企微审批中MySQL字段TEXT类型被截断的排查与修复实践

在MySQL中,TEXT类型字段常用于存储较大的文本数据,但在一些应用场景中,当文本内容较大时,TEXT类型字段可能无法满足需求,导致数据截断或插入失败。为了避免这种问题,了解不同文本类型(如TEXT、M…

异常 PipeMapRed.waitOutputThreads(): subprocess failed with code 127

直接放问题异常 hadoop jar /opt/module/hadoop-3.3.2/share/hadoop/tools/lib/hadoop-streaming-3.3.2.jar \ -D mapreduce.map.memory.mb100 \ -D mapreduce.reduce.memory.mb100 \ -D mapred.map.tasks1 \ -D stream.num.map.output.key.fields2 \ -D num.key.fields.for.pa…

Focal Loss (聚焦损失) :解决类别不平衡与难易样本的利器,让模型学会“重点学习”

1. 为什么需要Focal Loss? 2. 交叉熵损失的问题 3.Focal Loss的智慧:给不同的错误“区别对待” 4.代码演示 1. 为什么需要Focal Loss? 在机器学习和深度学习中,类别不平衡(Class Imbalance) 是一个普遍…

算法系列之数据结构-二叉树

在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问和修改数据。树(Tree)是一种非常重要的非线性数据结构,广泛应用于各种算法和应用中。本文将详细介绍树的基本概念、常见类型以及用Java实现树的遍历…

进来了解一下python的深浅拷贝

深浅拷贝是什么:在Python中,理解深拷贝(deep copy)和浅拷贝(shallow copy)对于处理复杂的数据结构,如列表、字典或自定义对象,是非常重要的。这两种拷贝方式决定了数据在内存中的复制…

磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)

背景: 最近往数据库里存的东西有点多,磁盘不够用 查看磁盘使用情况 df -h /dev/sda5(根目录 /) 已使用 92% 咱们来开源节流 目录 背景: 一、开源 二、节流 1.查找 大于 500MB 的文件: 1. Snap 缓存…

vue3学习-2(深入组件)

vue3学习-2(深入组件) 1.开始2.基础3.深入组件注册全局注册局部注册组件名格式 PropsProps 声明响应式 Props 解构 3.5将解构的 props 传递到函数中单向数据流更改对象 / 数组类型的 propsProp 校验 事件触发与监听事件事件参数声明触发的事件事件校验 组…

Java 入门 (超级详细)

一、什么是Java Java是一种高级编程语言,由Sun Microsystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点,被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运…

23种设计模式之工厂方法模式(Factory Method Pattern)【设计模式】

文章目录 一、工厂方法模式简介二、关键点三、代码示例3.1 定义抽象产品3.2 实现具体产品3.3 创建抽象工厂3.4 实现具体工厂3.5 客户端代码 四、解释五、优缺点5.1 优点5.2 缺点 六、适用场景 一、工厂方法模式简介 工厂方法模式(Factory Method Pattern&#xff0…

io学习----->标准io

思维导图: 一.io的作用 io是实现对文件的操作,把运行结果存到文件中,读取文件的数据,方便后期查询。 二.io的概念 io是指系统 和外部设备或用户之间的数据交互 I:input 表示数据从外部设备输入到内存中; O:output…

从 R1 到 Sonnet 3.7,Reasoning Model 首轮竞赛中有哪些关键信号?

DeepSeek R1 催化了 reasoning model 的竞争:在过去的一个月里,头部 AI labs 已经发布了三个 SOTA reasoning models:OpenAI 的 o3-mini 和deep research, xAI 的 Grok 3 和 Anthropic 的 Claude 3.7 Sonnet。随着头部 Al labs 先…

FPGA开发,使用Deepseek V3还是R1(7):以“FPGA的整体设计框架”为例

以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…

正大杯攻略|非量表题数据分析基本步骤

在各类研究和调查场景中,非量表类问卷作为数据收集的重要工具,其分析方法涵盖多个关键环节,对于精准解读数据、提炼有价值的结论起着决定性作用。下面详细介绍非量表类问卷的分析方法。 一、样本背景分析 样本背景分析借助描述性统计方法&am…

SuperMap iClient3D for WebGL三维场景与二维地图联动

作者:Lzzzz 在城市规划,应急救援,旅游规划等项目场景中,普遍存在通过二维地图定位区域或路线,三维场景展示布局细节的情况,那么,如何使三维场景与二维地图联动起来呢,一起来看看如何…