【Java面试丨并发编程】线程的基础知识

news2024/12/25 9:25:11

一、进程与线程的区别

1. 进程

  • 程序是由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存
  • 在指令运行过程中还需要用到磁盘、网络等设备
  • 进程就是用来加载指令、管理内存、管理IO的
  • 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程
    在这里插入图片描述

2. 线程

  • 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行
  • 一个进程之内可以分为一到多个线程
    在这里插入图片描述

3. 二者区别

  • 进程是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务
  • 不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间
  • 线程更轻量,线程上下文切换成本一般要比进程上下文切换低(上下文切换:指从一个线程切换到另一个线程)

二、并行与并发的区别

1. 单核CPU

  • 单核CPU下线程实际是串行执行的
  • 操作系统中有一个组件为任务调度器,其将CPU的时间片(Windows下时间片最小约为15毫秒)分给不同的程序使用,由于CPU在线程之间的切换非常快,人类感觉是同时运行的
  • 总结:微观串行,宏观并行
  • 一般会将这种线程轮流使用CPU的做法称为并发(Concurrent)
    在这里插入图片描述

2. 多核CPU

  • 每个核(Core)都可以调度运行线程,这时候线程可以是并行的
    在这里插入图片描述

3. 二者区别

  • 现在都是多核CPU,在多核CPU下
    (1)并发(Concurrent):同一时间应对(dealing with)多件事情的能力,多个线程轮流使用一个或多个CPU
    (2)并行(Parallel):同一时间动手(doing)多件事情的能力,4核CPU同时执行4个线程
    在这里插入图片描述

三、线程创建的方式有哪些

1. 继承Thread类

在这里插入图片描述

2. 实现Runnable接口

在这里插入图片描述

3. 实现Callable接口

在这里插入图片描述

4.线程池创建线程【项目中推荐使用该方式】

在这里插入图片描述

四、Runnable和Callable接口有什么区别

  • Runnable接口的run()方法没有返回值
  • Callable接口的call()方法有返回值,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
  • Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛

五、线程包括哪些状态,状态之间是如何变化的

1. 线程的状态

  • 可以参考JDK中Thread类中的枚举类State
    在这里插入图片描述

2. 状态之间转换

  • 创建线程对象是新建状态
  • 调用了start()方法转变为可执行状态
  • 线程获取到了CPU的执行权,执行结束是终止状态
  • 在可执行状态的过程中,如果没有获取到CPU的执行权,可能会切换成其他状态
    (1)如果没有获取到锁(Synchronized或Lock),则进入阻塞状态;获得锁再切换为可执行状态
    (2)如果线程调用了wait()方法,则进入等待状态,其他线程调用notify()方法唤醒后可切换为可执行状态
    (3)如果线程调用了sleep()方法,则进入计时等待状态,到时间后可切换为可执行状态
    在这里插入图片描述

六、在Java中wait()和sleep()方法的不同

1. 共同点

  • wait()/wait(long)和sleep(long)方法:效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态

2. 不同点

  • 方法归属不同
    (1)wait()/wait(long)方法:Object类的成员方法,每个对象都有
    (2)sleep(long)方法:Thread类的静态方法
  • 醒来时机不同
    (1)wait()/wait(long)方法可以被notify()/notifyAll()方法唤醒,wait()方法如果不被唤醒则一直等下去
    (2)执行wait(long)和sleep(long)方法的线程都会在等待相应毫秒后醒来
    (3)它们都可以被打断唤醒
  • 锁特性不同(重点)
    (1)wait()/wait(long)方法的调用必须先获取对象的锁,而sleep(long)方法无此限制
    (2)wait()/wait(long)方法执行后会释放对象锁,允许其他线程获得该对象锁(释放锁,在睡觉)
    (3)sleep(long)方法如果在Synchronized代码块中执行,并不会释放对象锁(抱着锁,在睡觉)

七、新建三个线程T1、T2、T3,如何保证它们按顺序执行

1. join()方法

  • join()方法:等待线程运行结束
  • t.join():阻塞调用此方法的线程,进入timed_waiting,知道线程t执行完成后,此线程再继续执行
    在这里插入图片描述

八、notify()和notifyAll()方法有什么区别

  • notify()方法:只随机唤醒一个wait线程
  • notifyAll()方法:唤醒所有wait线程

九、线程的run()和start()方法有什么区别

  • start()方法:用来启动线程,通过该线程调用run()方法执行run()方法中所定义的逻辑代码。start()方法只能被调用一次
  • run()方法:封装了要被线程执行的代码,就是一个普通的方法,可以被调用多次

十、如何停止一个正在运行的线程

  • 使用退出标志,使线程正常退出,也就是当run()方法完成后线程终止
  • 使用stop()方法强制终止(不推荐,该方法已作废)
  • 使用interrupt()方法中断线程
    (1)打断阻塞的线程(sleep、wait、join),线程会抛出InterruptedException异常
    (2)打断正常的线程,可以根据打断状态来标记是否退出线程

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

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

相关文章

青岛大学_王卓老师【数据结构与算法】Week05_08_顺序栈的操作2_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础…

C++学习 内存分区模型

内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理。全局区:存放全局变量和静态变量以及常量。栈区:由编译器自动分配释放,存放函数的参数值&#…

【TI毫米波雷达笔记】DCA1000EVM+mmWave Studio数据采集的MIMO模式设置(多天线发射工作模式)

【TI毫米波雷达笔记】DCA1000EVMmmWave Studio数据采集的MIMO模式设置(多天线发射工作模式) 以IWR6843AOP为例 其为3发4收的雷达 MIMO模式有两种 TDM-MIMO和BPM-MIMO TDM-MIMO模式(时分复用) TDM-MIMO模式是最简单和常用的MIM…

Vector - CANoe - CAPL文件加密

目录 为什么会有CAPL文件加密需求? 加密文件介绍 “*.can”和“*.cin” 文件创建 <

win11安装virtual box和vagrant,附带centos7镜像

环境检查 1. 开启CPU虚拟化 修规bios配置 configuration -> Intel Virtual Technology 改为 enabled 2. 关闭hyper-v 以管理员启动 powershell&#xff0c;执行&#xff1a; bcdedit /set hypervisorlaunchtype off 3. 关闭wsl虚拟机 以管理员启动 powershell&#x…

C#探索之路(10):实现一个简单应用的功能——志愿填报

C#探索之路(10)&#xff1a;实现一个简单应用的功能——志愿填报 文章目录 C#探索之路(10)&#xff1a;实现一个简单应用的功能——志愿填报1、前景&#xff1a;2、需求分析3、功能实现3.1、界面交互-输入3.2、界面交互-输出 3、代码示例&#xff1a;4、效果图&#xff1a;5、总…

利用缓存模拟进度条(c实现)

代码如下&#xff1a; #include <stdio.h> #include <Windows.h>int main() {int total 100;int progress 0;char progressBar[101] {};while (progress < total) {progressBar[progress] #;printf("[%-100s] %d%%", progressBar, progress);ffl…

音视频开发实战03-FFmpeg命令行工具移植

一&#xff0c;背景 作为一个音视频开发者&#xff0c;在日常工作中经常会使用ffmpeg 命令来做很多事比如转码ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 &#xff0c;水平翻转视频&#xff1a;ffmpeg -i src.mp4 -vf hflip -acodec copy …

爬虫相关知识与面试题目

常见的反爬虫和应对方法 参考:https://www.cnblogs.com/bsdr/p/5151891.html 0x01 常见的反爬虫 这几天在爬一个网站&#xff0c;网站做了很多反爬虫工作&#xff0c;爬起来有些艰难&#xff0c;花了一些时间才绕过反爬虫。在这里把我写爬虫以来遇到的各种反爬虫策略和应对的…

判断 Mac显卡 mps 是否可以正常运行

文章目录 Mac MPS介绍判断 Mac mps 是否可以正常运行Mac 指定 mps 进行推理示例Mac M1 GPU 训练 相比 CPU 速度提升对比&#x1f4d9; 开心搬砖每一天 Mac MPS介绍 使用 Apple 的 Metal Performance Shaders (MPS) 作为 PyTorch 的后端来启用加速 GPU 训练。 MPS 后端扩展了 P…

SpringBoot源码分析(5)--createApplicationContext创建应用上下文

文章目录 一、前言二、ApplicationContext简述2.1、Spring IOC容器实现方式 三、createApplicationContext/创建应用上下文3.1、DefaultResourceLoader3.2、AbstractApplicationContext3.3、GenericApplicationContext3.3.1、SimpleAliasRegistry3.3.2、DefaultSingletonBeanRe…

ARM中栈的种类与运用

1. 栈的概念 栈&#xff0c;本身是一段内存&#xff0c;程序运行时用于保存一些临时数据&#xff0c;如局部变量、参数、返回地址等等。 学习了数据结构&#xff0c;对栈的概念相信大家都不陌生&#xff0c;后进先出的数据结构&#xff0c;即最后进栈的元素最先出栈。但是在C语…

用html+javascript打造公文一键排版系统5:二级标题排版

公文中二级标题的一般以&#xff08;X&#xff09;标注&#xff08;其中X为由"一二三四五六七八九十"中的字符组成的字符串&#xff09;&#xff0c;用楷体字加粗。 首先我们要判断一段文字是否包含二级标题&#xff0c;最简单的方法 就是判断文字中的头一个字符是否…

springBoot整合二维码

一、引入坐标 <!-- 二维码 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing</group…

Unhandled error during execution of component event handler at

Unhandled error during execution of component event handler at 执行组件事件处理程序期间出现未处理的错误 在 意思就是有些地方的值用早了,在没有数据之前就使用了 我这次报错是子组件的表单校验 调用事件就报错了 解决方法 setTimeout(() > { //调用方法 }, 0); 就是…

chapter10:SpringBoot与缓存

尚硅谷SpringBoot整合教程 1. JSR107 缓存开发规范&#xff0c;Java Caching 定义了5个核心接口&#xff0c; 分别是CachingProvider&#xff0c;CacheManager&#xff0c;Cache&#xff0c;Entry和Expiry。 CachingProvider&#xff1a;定义了创建&#xff0c;配置&#xff…

【bug】flameshot在ubuntu上的4K屏幕,双屏幕上用不了截图

问题 直接在4K屏幕上运行flameshot截图&#xff0c;直接黑屏 主屏 &#xff1a;4K 副屏&#xff1a;2k 解决 2.1长按1-2秒开机键&#xff0c;先回到桌面。 2.2 设置主屏缩放为125% 2.3 设置键盘快捷键命令为env QT_AUTO_SCREEN_SCALE_FACTOR1 flameshot gui 替代flameshot的…

第51步 深度学习图像识别:Convolutional Vision Transformer建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Convolutional Vision Transformers Convolutional Vision Transformer&#xff08;ConViT&#xff09;是一种结合了卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09…

飞机【频闪灯、导航灯】效果的设置——灯和灯的光晕

一、飞机外部灯光系统——频闪灯和防撞灯——闪烁效果 二、实现的原理 如下图所示&#xff0c;灯效果的组成包含两部分&#xff0c;一是灯本身&#xff0c;二是灯光产生的光晕 灯—— 就是一个球&#xff08;Sphere&#xff09;,给它一个Emission(自发光)材质光晕——光晕的…

云苍穹各类参数使用说明

目录 公共参数 云参数 应用参数 单据参数 单据类型参数 用户选项参数 列表选项参数 公共参数 不推荐使用 参数值获取&#xff1a; // 获取整体公共参数 Map<String,Object> publicParamWhole SystemParamServiceHelper.loadPublicParametersFromCache();// 获取某…