并发编程(线程基础)

  • 线程和进程的区别
  • 并发与并行的区别
  • 线程创建方式
  • runnable和callable的区别
  • run()和start()的区别
  • 线程包括哪些状态,状态之间如何变化
  • 新建三个线程,如何按顺序执行
  • notify()和notifyAll()的区别
  • wait和sleep方法的区别
  • 如何停止一个正在运行的线程

一、线程和进程的区别

根本区别:进程是操作系统资源分配的基本单位,线程是CPU任务调度和执行的基本单位

对比

  • 进程是正在运行程序的实例,一个进程可以包含多个线程,不同线程执行不同任务
  • 各个进程拥有独立的内存资源,同一个进程下的所有线程共享当前进程内存资源
  • 对比进程,线程没有操作系统为其分配的独立内存空间,而是共享进程的内存空间,更加轻量,上下文切换成本更低。

二、并行和并发的区别 

在多核CPU下

并行:同一时间做多件事的能力,4核CPU同时执行4个线程

并发:同一时间只处理一个线程,各线程上下文快速切换

并发是逻辑上的同时发生(切换速度很快,感受不到)

并行是物理上的同时发生


三、线程创建的方式 

  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口
  • 通过线程池创建

3.1、继承Thread类

  1. 创建Thread子类
  2. 子类重写run方法
  3. 创建子类对象
  4. 子类对象调用start()开启线程

3.2、实现Runnable接口

  1. 创建Runnable实现类
  2. 重写run方法
  3. 实例化Runnable实现类对象
  4. 以该对象作为构造器参数构造Thread类
  5. 调用Thread对象的start()方法开启线程

3.3、实现Callable接口

  1. 创建Callable实现类
  2. 重写call方法
  3. 实例化Callable实现类对象
  4. 将Callable实现类对象作为参数构建FutureTask对象
  5. 将FutureTask对象作为构造器参数创建Thread对象
  6. 调用Thread对象的start()方法开启线程
  7. 通过FutureTask对象的get()方法获取call方法返回值

3.4、通过线程池创建 


四、 runnable和callable的区别

对比一下

1、方法名不同,Runnable为run方法,Callable为call方法

2、返回值不同,Runnable无返回值,Callable返回泛型,可配合FutureTask拿到返回结果

3、异常处理不同,Runnable异常需要内部处理,不能抛出。Callable可以抛出


 五、run()和start()的区别

“start()方法会使得该线程开始执行;java虚拟机会去调用该线程的run()方法。”

因此,t.start()会导致run()方法被调用,run()方法中的内容称为线程体,它就是这个线程需要执行的工作。

用start()来启动线程,实现了真正意义上的启动线程,此时会出现异步执行的效果,即在线程的创建和启动中所述的随机性。‘ 

而如果使用run()来启动线程,只是单纯的执行重写后的run方法,没有开启新线程。

  • start():使新线程开始执行,jvm 自动调用该线程run()方法。异步操作
  • run():单纯的执行重写后的run方法,没有开启新线程。同步操作

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

Thread类中的枚举类State里有介绍了线程的六种状态

新建状态、可执行状态(阻塞状态、等待状态、计时等待状态)、死亡状态

NEW ==> RUNNABLE ==> BLOCKED ==> WAITING ==>  TIMED_WAITING ==> TERMINATED

简单来讲可以看出三个状态:新建状态、可执行状态、死亡状态

new Thread是新建状态(NEW),调用start()方法后进入可执行状态(RUNNABLE),拿到CUP执行全后进入死亡状态(TERMINATED),如果没有拿到CPU执行权,可能进入如下三种状态

  • 当前线程无法拿到锁,进入阻塞状态(BLOCKED),获得锁之后恢复可执行状态
  • 当前线程调用了wait()方法,进入等待状态(WAITING),其它线程调用nitify()唤醒后可恢复执行状态
  • 当前线程调用了sleep()方法,进入计时等待状态(TIMED_WAITING),到时间后恢复可为执行

 七、新建三个线程,如何按顺序执行

使用join方法

    public static void main(String[] args) {Thread t1 = new Thread(() -> {System.out.println("t1");});Thread t2 = new Thread(() -> {try {t1.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t2");});Thread t3 = new Thread(() -> {try {t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t3");});t2.start();t3.start();t1.start();

join方法加了synchronized,保证串行执行。

- 如果参数为负数,则直接报错:"timeout value is negative"

- 如果join方法参数为0,则会调用isAlive()方法,检测线程是否存活,如果存活就调用wait方法,一直等待。
- 如果参数大于0,使用while判断线程是否存活,存活的话就一直判断当前线程执行的时间并且计算还需要等待的时间,如果等待时间小于等于0就跳出循环,否则就继续wait


八、notify()和notifyAll()的区别 

锁池:假如线程A拿到了锁,则B进入阻塞状态,进入锁池,等待锁释放

等待池:A拿到锁后执行wait方法,释放锁,进入等待池

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

linux远程桌面管理工具xrdp

一、概述 我们知道,我们日常通过vnc来远程管理linux图形界面,今天分享一工具Xrdp,它是一个开源工具,允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP之外,xrdp工具还接受来自其他RDP客户端的连接&#xf…

代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零

前言 : 动规五部曲 理论基础 : 代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树-CSDN博客 1.明白dp数组的含义 2.明白递推公式的含义 3.初始化dp数组 4.注意dp数组的遍历顺序 5.打印dp数组排错 LeetCode T1049 最后一块石头的重量II 题目链接:1049. 最后一块石头…

多技术融合提升环境、生态、水文、土地、农业、大气等领域科研技术水平

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 点击查看原文链接https://mp.weixin.qq.com/s?__bizMzg2NDYxNjMyNA&mid2247546998&idx6&sn39342c376b158eff1…

坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法

阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法,亲测有效: Mobax好卡啊,那就直接在阿里云后台操作即可,阿里云后台也可以上传文件。 Navicat mysql好卡啊,那就直接在阿里云后台最上面帮助的右边有个数据库&…

使用Llama index构建多代理 RAG

检索增强生成(RAG)已成为增强大型语言模型(LLM)能力的一种强大技术。通过从知识来源中检索相关信息并将其纳入提示,RAG为LLM提供了有用的上下文,以产生基于事实的输出。 但是现有的单代理RAG系统面临着检索效率低下、高延迟和次优提示的挑战。这些问题在…

stable-diffusion 电商领域prompt测评集合

和GhostReivew一个思路,还是从比较好的图片或者是civitai上找一些热门的prompt,从小红书上也找到了不少的prompt,lexica.art上也有不少,主要是为了电商场景的一些测评: 小红书、civitai、Lexica、Liblib.ai、 depth o…

excel制作透视表

场景描述: 有一张excel表,存在多条记录,现在需要把相同名称的商品的数量求和,放在一起展示 操作步骤: 删除最后一行数据 选中不显示分类汇总 以表格形式展示

【算法 | 哈希表 No.2】leetcode 219. 存在重复元素II

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

黄仁勋:英伟达预言 2 年内行业将面目全非 一个词形容AI:Unbelievable

本心、输入输出、结果 文章目录 黄仁勋:英伟达预言 2 年内行业将面目全非 一个词形容AI:Unbelievable前言【访谈内容】一个词形容AI:Unbelievable创立英伟达“比想象中难一百万倍”相关图片传送门弘扬爱国精神 黄仁勋:英伟达预言 …

AR的光学原理?

AR智能眼镜的光学成像系统 AR眼镜的光学成像系统由微型显示屏和光学镜片组成,可以将其理解为智能手机的屏幕。 增强现实,从本质上说,是将设备生成的影像与现实世界进行叠加融合。这种技术基本就是通过光学镜片组件对微型显示屏幕发出的光线…

Temp directory ‘C:\WINDOWS\TEMP‘ does not exist

问题描述 解决方法 管理员权限问题,进入temp文件夹更改访问权限即可。 点击 temp文件夹 属性 -> 安全 -> 高级 -> 更改主体Users权限 给读取和写入权限 参考博客 开发springboot项目时无法启动Temp directory ‘C: \WINDOWS\TEMP‘ does not exist

Python武器库开发-常用模块之configparser模块(十六)

configparser模块(十六) ConfigParser模块在python3中修改为configparser.这个模块定义了一个ConfigParser类,该模块的作用就是用来读取配置文件的,使用模块中的RawConfigParser()、ConfigParser()、 SafeConfigParser()这三个方法,创建一个…

Github 自动化部署到GitHub Pages

1.准备工作 新建仓库 新建项目 配置 vite.config.ts base: ./,部署应用包时的基本URL,例:vue-cli 5.x 配置 publicPath 推送到远程仓库 2.配置 GitHub Token 点击 Settings -> Actions -> General 找到 Workflow permissions,选中第…

BetterDisplay Pro v1.4.15(显示器管理管理软件)

BetterDisplay Pro是一款屏幕显示优化工具,可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数,以获得更好的视觉体验。此外,BetterDisplay Pro还提供了一些额外的功能,如屏幕分割、窗口管理、快捷键…

vivo发布“蓝心千询”自然语言对话机器人

🦉 AI新闻 🚀 vivo发布“蓝心千询”自然语言对话机器人 摘要:vivo今日发布了“蓝心千询”自然语言对话机器人,基于蓝心大模型。蓝心千询可以进行知识信息的快速问答,文学创作、图片生成,甚至还能编写程序…

✔ ★【备战实习(面经+项目+算法)】 11.3学习

✔ ★【备战实习(面经项目算法)】 坚持完成每天必做如何找到好工作1. 科学的学习方法(专注!效率!记忆!心流!)2. 每天认真完成必做项,踏实学习技术 认真完成每天必做&…

[GitLab] 安装Git 指定版本

卸载旧版本 检查是否已经安装 git --version如果已经安装,先卸载 yum -y remove git安装新版本 在GitHub上选择需要下载的版本 Git版本 在/usr/local/目录下新建文件夹:git,并在/usr/local/git/文件夹内下载压缩包 wget https://github…

串口通信代码整合1

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

【Redis】String字符串类型-内部编码使用场景

文章目录 内部编码使用场景缓存功能计数功能共享会话手机验证码 内部编码 字符串类型的内部编码有3种: int:8个字节(64位)的⻓整型,存储整数embstr:压缩字符串,适用于表示较短的字符串raw&…

JavaScript:事件循环机制(EventLoop)

一、理解进程、线程 进程是操作系统中的基本概念之一,指的是一个正在运行中的程序,包括了程序的执行代码、数据、资源等。操作系统为每个进程分配一定的系统资源,例如内存空间、文件和设备等,以便进程能够正常运行。 线程是进程…