并发编程(线程基础)

news2024/11/28 18:48:01
  • 线程和进程的区别
  • 并发与并行的区别
  • 线程创建方式
  • 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.coloradmin.cn/o/1168593.html

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

相关文章

保存修改后的图形化配置文件

37.4.5 保存修改后的图形化配置文件 如果使用 V2.4 以前的底板,用的是 LAN8720A 这颗 PHY 芯片,我们在修改网络驱动的时 候我们通过图形界面使能了 LAN8720A 的驱动,使能以后会在.config 中存在如下代码: CONFIG_SMSC_PHYy 打开 d…

基于RK3568的新能源储能能量管理系统ems

新能源储能能量管理系统(EMS)是一种基于现代化技术的系统,旨在管理并优化新能源储能设备的能量使用。 该系统通过监测、调度和控制新能源储能设备来确保能源的高效利用和可持续发展。 本文将从不同的角度介绍新能源储能能量管理系统的原理、…

idea个性设置

这种灰色代码连在一起

完美处理 Android App 的 apk 输出路径与文件名

实现代码 buildTypes {// ...applicationVariants.all {variant ->variant.outputs.all {Calendar calendar Calendar.getInstance(Locale.CHINA);def buildDate String.format(Locale.CHINA, "%04d%02d%02d", calendar.get(Calendar.YEAR), calendar.get(Cale…

Telnet/ssh/Serial远程工具WindTerm

Telnet/ssh/Serial远程工具WindTerm 一、WindTerm 概述二、WindTerm 下载 一、WindTerm 概述 在远程终端工具中,secureCrt 和 XShell 是两款比较有名的远程工具,但收费。上一篇文章就介绍了一款免费软件MobaXterm,但菜单都是英文的&#xff0…

Doris:StreamLoad导入数据

目录 1.基本原理 2.支持数据格式 3.StreamLoad语法 3.1.请求参数 3.2.返回参数 4.StreamLoad实践 4.1.使用 curl命令 4.2.使用Java代码 Stream load 是一个同步的导入方式,用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 主…

图片有水印怎么去?这三招轻松去除图片水印

当我们在网站找一些的图片做头像或者壁纸的时候,会发现一些好看的图片上会带有一些平台水印,这些水印影响了整张照片的美观,那么图片有水印怎么去呢?这时就需要借用图片处理工具来操作。那你们知道图片有水印怎么去吗?今天我就来…

LCR 166.珠宝的最高价值 + 动态规划 + 记忆化搜索 + 递推 + 空间优化

LCR 166. 珠宝的最高价值 - 力扣(LeetCode) 现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为: 只能从架子的左上角开始拿珠宝每次可以移动到右侧或下侧的相邻位置到达珠宝架子的右下…

匪夷所思,spring aop这么写竟然会失效!!

背景 spring 版本:3.2.8.RELEASEJDK版本:1.8本地是正常,线上环境是有问题的 应用从云下迁移到云上的过程中出现了一个应用部分aop 通知失效的问题,场景如下: node1 节点上的category 是失效的,element是正…

ubuntu 分区 方案

ubuntu 分区 方案 自动分区啥样子的? 手动分区 需要怎么操作? 注意点是啥? swap分区 要和 内存大小 差不多 安装ubuntu系统时硬盘分区方案 硬盘分区概述 一块硬盘最多可以分4个主分区,主分区之外的成为扩展分区。硬盘可以没有…

C++--二叉搜索树初阶

前言:二叉搜索树是一种常用的数据结构,支持快速的查找、插入、删除操作,C中map和set的特性也是以二叉搜索树作为铺垫来实现的,而二叉搜索树也是一种树形结构,所以,在学习map和set之前,我们先来学…

学习率设置

在我们刚刚接触深度学习时,对学习率只有一个很基础的认知,当学习率过大的时候会导致模型难以收敛,过小的时候会收敛速度过慢,其实学习率是一个十分重要的参数,合理的学习率才能让模型收敛到最小点而非局部最优点或鞍点…

学 Java 怎么进外企?

作者:**苍何,CSDN 2023 年 实力新星,前大厂高级 Java 工程师,阿里云专家博主,土木转码,现任部门技术 leader,专注于互联网技术分享,职场经验分享。 🔥热门文章推荐&#…

HNU程序设计 练习三-控制结构

1.台球游戏 【问题描述】 在本台球游戏中,包含多种颜色的球,其中:红球15只各1分、黄球1只2分、绿球1只3分、咖啡球1只4分、蓝球1只5分、粉球1只6分、黑球1只7分。 球的颜色表示为: r-红色球 y-黄色球 g-绿色球 c-咖啡色球 b-蓝色…

闭循环低温恒温器的使用注意事项

与液氮恒温器相比,闭循环低温恒温器显得稍微复杂一些!这主要表现在组成部分、体积重量、使用操作、升降温时间等方面。闭循环低温恒温器主要由冷头、氦压缩机、两根氦气连管组成,配套设备还有控温仪、真空泵,可能还有循环水冷机。…

离散数学实践(2)-编程实现关系性质的判断

*本文为博主本人校内的离散数学专业课的实践作业。由于实验步骤已经比较详细,故不再对该实验额外提供详解,本文仅提供填写的实验报告内容与代码部分,以供有需要的同学学习、参考。 -------------------------------------- 编程语言&#xff…

VM虚拟机逆向 --- [NCTF 2018]wcyvm 复现

文章目录 前言题目分析 前言 第四题了,搞定,算是独立完成比较多的一题,虽然在还原汇编的时候还是很多问题。 题目分析 代码很简单,就是指令很多。 opcode在unk_6021C0处,解密的数据在dword_6020A0处 opcode [0x08, …

谈一谈SQLite、MySQL、PostgreSQL三大数据库

每一份付出,必将有一份收货,就像这个小小的果实,时间到了,也就会开花结果… 三大数据库概述 SQLite、MySQL 和 PostgreSQL 都是流行的关系型数据库管理系统(RDBMS),但它们在功能、适用场景和性…

【UE】从UI拖拽生成物体 —— 更改位置与定点销毁

本篇在上一篇博客(【UE】从UI中拖拽生成物体-CSDN博客)基础上继续增加更改生成的Actor的位置与定点销毁Actor的功能。 目录 效果 步骤 一、修改生成好的Actor位置 解决问题一:从UI拖出多个actor后,只能对第一个拖出的actor的…

传智杯-21算法赛初赛B组题目详细解法解析-AB题(C/C++、Python、Java)

🚀 欢迎来到 ACM 算法题库专栏 🚀 在ACM算法题库专栏,热情推崇算法之美,精心整理了各类比赛题目的详细解法,包括但不限于ICPC、CCPC、蓝桥杯、LeetCode周赛、传智杯等等。无论您是刚刚踏入算法领域,还是经验丰富的竞赛选手,这里都是提升技能和知识的理想之地。 ✨ 经典…