15.多线程概述一(下篇)

news2024/9/20 23:14:12
  • 目录

    1.进程与线程

    2.实现多线程方式一:继承Thread类【应用】

    3.实现多线程方式二:实现Runnable接口【应用】

    4.实现多线程方式三:实现Callable接口【应用】

    5.三种实现方式的对比与套路

    6.设置和获取线程名称/线程对象【应用】

    7.线程优先级与线程休眠【应用】

    8.守护线程【应用】

    9.线程同步

    10.生产者消费者

    11.阻塞队列基本使用与等待唤醒机制【理解】

    12.线程状态


  • 1.进程与线程

    • 1.1进程:是正在运行的程序
      • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
      • 动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的
      • 并发性:任何进程都可以同其他进程一起并发执行
    • 1.2线程:是进程中的单个顺序控制流,是一条执行路径
      • 单线程:一个进程如果只有一条执行路径,则称为单线程程序
      • 多线程:一个进程如果有多条执行路径,则称为多线程程序(会在main线程前运行)
  • 2.实现多线程方式一:继承Thread类【应用】

    • 2.1方法介绍
      • void run()
        在线程开启后,此方法将被调用执行
      • void start()
        使此线程开始执行,Java虚拟机会调用run方法()
    • 2.2实现步骤
      • 定义一个类MyThread继承Thread类
      • 在MyThread类中重写run()方法
      • 创建MyThread类的对象
      • 启动线程
    • 2.3细节
      • 重写run()方法作用:用来封装被线程执行的代码
      • run()方法与start()方法的区别:
        • run():封装线程执行的代码,直接调用,相当于普通方法的调用(并非调用线程)
        • start():启动线程;然后由JVM调用此线程的run()方法
  • 3.实现多线程方式二:实现Runnable接口【应用】

    • 3.1Thread构造方法
      • Thread(Runnable target)
        分配一个新的Thread对象
      • Thread(Runnable target, String name)
        分配一个新的Thread对象并为其命名
    • 3.2实现步骤
      • 定义一个类MyRunnable实现Runnable接口
      • 在MyRunnable类中重写run()方法
      • 创建MyRunnable类的对象
      • 创建Thread类的对象,把MyRunnable对象作为构造方法的参数
      • 启动线程
  • 4.实现多线程方式三:实现Callable接口【应用】

    • 4.1方法介绍
      • V call()
        计算结果,如果无法计算结果,则抛出一个异常
      • FutureTask(Callable<V> callable)
        创建一个 FutureTask,一旦运行就执行给定的 Callable
      • V get()
        如有必要,等待计算完成,然后获取其结果
    • 4.2实现步骤
      • 定义一个类MyCallable实现Callable接口
      • 在MyCallable类中重写call()方法
      • 创建MyCallable类的对象
      • 创建Future的实现类FutureTask对象,把MyCallable对象作为构造方法的参数
      • 创建Thread类的对象,把FutureTask对象作为构造方法的参数
      • 启动线程
      • 再调用get方法,就可以获取线程结束之后的结果。
    • 4.3细节
      • 此方式可以获取多线程运行的结果:也就是return
  • 5.三种实现方式的对比与套路

    • 5.1实现Runnable、Callable接口
      • 好处: 扩展性强,实现该接口的同时还可以继承其他的类
      • 缺点: 编程相对复杂,不能直接使用Thread类中的方法
    • 5.2继承Thread类
      • 好处: 编程比较简单,可以直接使用Thread类中的方法
      • 缺点: 可以扩展性较差,不能再继承其他的类
    • 5.3书写套路
      • 1. while(true)死循环
      • 2. synchronized 锁,锁对象要唯一
      • 3. 判断,共享数据是否结束。结束
      • 4. 判断,共享数据是否结束。没有结束(执行核心逻辑)
  • 6.设置和获取线程名称/线程对象【应用】

    • 6.1方法介绍:
      • void setName(String name)
        将此线程的名称更改为等于参数name
      • String getName()
        返回此线程的名称
      • static Thread currentThread()
        返回对当前正在执行的线程对象的引用
        System.out.println(Thread.currentThread().getName());
    • 6.2细节:
      • setName细节:如果没有给线程设置名字,默认为格式:Thread-X(X为序号,从0开始)
      • currentThread细节:JVM虚拟机启动之后,会自动的启动多条线程,其中有一条线程就叫做main线程,他的作用就是调用main方法,并执行里面的代码,所有的代码其实都是运行在main线程中
  • 7.线程优先级与线程休眠【应用】

    • 7.1线程调度
      • 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
      • 抢占式调度模型(Java中使用):优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
      • 注意:优先级不是绝对的,它是一个概率
    • 7.2优先级相关方法
      • final int getPriority()
        返回此线程的优先级
      • final void setPriority(int newPriority)
        更改此线程的优先级线程默认优先级是5;线程优先级的范围是:1-10
    • 7.3线程休眠方法
      • static void sleep(long millis)
        使当前正在执行的线程停留(暂停执行)指定的毫秒数
        Thread.sleep(100);
  • 8.守护线程【应用】

    • 8.1相关方法
      • void setDaemon(boolean on)
        将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出(非守护线程结束,守护线程会陆续结束:一般不会完成)
      • void setDaemon(boolean on)
        出让一次线程/礼让一次线程
      • public static void join()
        插入一次线程/插队一次线程(插入的是当前线程)
    • 8.2应用场景
      • QQ聊天的过程中传输文件,其中传输文件就是守护线程,聊天线程关闭后,文件不必再传输
  • 9.线程同步

    • 9.1同步代码数据安全问题
      • 安全问题出现的条件
        • 是多线程环境
        • 有共享数据
        • 有多条语句操作共享数据
      • 如何解决多线程安全问题呢?
        • 基本思想:让程序没有安全问题的环境
      • 怎么实现呢?
        • 把多条语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可
        • Java提供了同步代码块的方式来解决
    • 9.2同步代码块
      • 格式:synchronized(任意对象) { 多条语句操作共享数据的代码 }
      • 注意:任意对象可以是任意的但是要保证是唯一
        方式一:static Object obj = new Object()
        方式二:类名.class(表示当前类的字节码文件对象)
        若不是唯一的则锁不住代码,没有意义(例如:this:调用者的本身)
        synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁
      • 同步的好处与弊端
        • 好处:解决了多线程的数据安全问题
        • 弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
    • 9.3同步方法块
      • 同步方法块:
        • 格式:修饰符 synchronized 返回值类型 方法名(方法参数) { 方法体; }
        • 同步方法锁的对象:this
      • 静态同步方法:
        • 同步静态方法:就是把synchronized关键字加到静态方法上
        • 同步静态方法的锁对象:类名.class
      • 特点:同步方法是锁住方法里面所有的代码
    • 9.4Lock锁
      • 我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock
      • ReentrantLock构造方法:ReentrantLock()
        Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
        创建一个ReentrantLock的实例
      • 加锁方法:void lock()
        获得锁
      • 解锁方法:void unlock()
        释放锁
      • 注意:unlock()一定要执行,一般放在finally代码块中
    • 9.5死锁
      • 概述:线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行
      • 产生死锁的情况:1.资源有限 2.同步嵌套
  • 10.生产者消费者

    • 10.1生产者消费者的俩类线程:
      • 一类是生产者线程用于生产数据
      • 一类是消费者线程用于消费数据
    • 10.2生产者与消费者的关系
      • 为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库
      • 生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为
      • 消费者只需要从共享数据区中去获取数据,并不需要关心生产者的行为
    • 10.3Object类的等待与唤醒方法
      • void wait()
        当线程调用对象的wait()方法时,它会释放该对象的监视器锁。这允许其他线程能够进入同步代码块或方法,并获得锁以执行其操作。(与此相反sleep方法不会释放监视器锁)
      • void notify()
        唤醒正在等待对象监视器的单个线程
      • void notifyAll()
        唤醒正在等待对象监视器的所有线程
    • 10.4生产者与消费者案例优化【应用】
  • 11.阻塞队列基本使用与等待唤醒机制【理解】

  • 12.线程状态

    • 12.1线程状态图【java中无运行状态】

    • 12.2java中线程的状态

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

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

相关文章

芹菜麦饭的做法

蒸煮时间&#xff1a; 芹菜麦饭的蒸煮时间因做法和食材的不同而有所差异&#xff0c;但一般在‌8到15分钟‌之间。具体蒸煮时间取决于芹菜的大小、切段的长度以及蒸锅的火力等因素。例如&#xff0c;将裹好面粉的芹菜段放入蒸锅&#xff0c;大火烧开后转中火蒸10~15分钟&#x…

LeetCode118:杨辉三角

题目链接&#xff1a;118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution {public:vector<vector<int>> generate(int numRows) {vector<vector<int>> dp(numRows);vector<int> temp(numRows);for (int i 0; i &…

数据中台建设(六)—— 数据开发-提取数据价值

数据开发-提取数据价值 数据开发涉及的产品能力主要包括三部分&#xff1a;离线开发、实时开发和算法开发。 离线开发主要包括离线数据的加工、发布、运维管理&#xff0c;以及数据分析、数据探索、在线查询和及时分析相关工作。实时开发主要涉及数据的实时接入和实时处理。算…

Jmeter 线程组解析

1.seUp线程组 一种特殊的 threadGroup &#xff0c;可用于执行预测试操作&#xff1b;它的行为完全像一个正常的线程组元件&#xff0c;不同的是执行顺序。 它会在普通线程组执行之前被触发。 应用场景&#xff1a; 测试数据库操作功能时&#xff0c;用于执行打开数据库连接的…

邮件营销:助力企业转换客户,提升曝光率

邮件营销&#xff1a;独立站推广的关键策略 在独立站推广的众多方法中&#xff0c;邮件营销占据着重要地位。本文将为刚刚接触独立站运营的新手介绍邮件营销的基础知识。在信息泛滥的时代&#xff0c;开设一个店铺和成功地引流并不意味着一劳永逸。对于绝大多数中小型电商企业…

基于SpringBoot+Vue+MySQL的养老院管理系统

系统展示 管理员界面 家属界面 系统背景 随着全球人口老龄化的加速&#xff0c;养老院管理面临着前所未有的挑战。传统管理方式存在信息不透明、效率低下、资源分配不均等问题&#xff0c;难以满足日益增长的养老服务需求。因此&#xff0c;开发一套智能化、高效的养老院管理系…

Vue使用qrcodejs2-fix生成网页二维码

安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…

三菱变频器Modbus-RTU 通讯规格

能够从变频器的 RS-485 端子使用 Modbus-RTU 通讯协议&#xff0c;进行通讯运行和参数设定。 NOTE: 1、使用 Modbus-RTU 通讯协议时&#xff0c;请设定Pr.549 协议选择 “1” 2、从主机按地址0(站号0)进行hodbus-RTU通讯时&#xff0c;为广播通讯&#xff0c;变频器不向主机发…

Vue3(一) Vite创建Vue3工程,选项式API与组合式API;setup的使用;Vue中的响应式ref,reactive

文章目录 一、创建Vue3工程1. vue-cli方式2. vite方式3. 项目小说明4. 安装插件&#xff1a;(1) Prettier--整理格式(2) Vue-official 二、 OptionsAPI 与 CompositionAPI1 选项式API的弊端2 组合式API的优势 三、setup1. 基本使用2 setup与组合式API3 setup语法糖 四、Vue中的…

Matlab R2024B软件安装教程

一、新版本特点 MATLAB R2024B版本带来了众多新特性和改进&#xff0c;旨在提升用户的内容创作体验和工程效率。以下是该版本的一些主要特点&#xff1a; 1. 性能提升和优化&#xff1a;R2024B版本在性能上进行了显著优化&#xff0c;无论是在提问、回答问题、发布新技巧还是…

OpenCV系列教程二:基本图像增强(数值运算)、滤波器(去噪、边缘检测)

文章目录 一、基本图像增强&#xff08;数值运算&#xff09;1.1 加法 &#xff08;cv2.add&#xff09;1.1.1 图像与标量相加&#xff08;调节亮度&#xff09;1.1.2 图像与图像相加&#xff08;两个图像shape要相同&#xff09;1.1.3 图像的加权加法&#xff08;渐变切换&…

nodejs 012:Babel(巴别塔)语言转换与代码兼容

这里写目录标题 安装 Babel配置presets配置&#xff1a;常见的 Babel Presetsplugins配置&#xff1a;以 plugin-transform-class-properties 的类中属性为例index.jsx Babel 是一个独立的 JavaScript 编译器&#xff0c;主要用于将现代 JavaScript 代码转换为旧版本的 JavaScr…

数据结构之二叉树(1)

数据结构之二叉树&#xff08;1&#xff09; 一、树 1、树的概念与结构 &#xff08;1&#xff09;树是一种非线性的数据结构&#xff0c;由n(n>0)个有限结点组成一个具有层次关系的集合。 &#xff08;2&#xff09;树有一个特殊的结点&#xff0c;叫做根结点&#xff…

Linux多块磁盘挂载同一目录

1、背景 由于服务器磁盘空间使用率已经使用占比超过95%&#xff0c;故购买了些磁盘对服务器进行扩容&#xff0c;但是如果直接进行磁盘挂载的&#xff0c;那么就只能挂载一个磁盘挂载一个目录&#xff0c;使用新磁盘空间得不到最大的利用率&#xff0c;故需要将多块磁盘合并为…

【RabbitMQ】死信队列、延迟队列

死信队列 死信&#xff0c;简单理解就是因为种种原因&#xff0c;无法被消费的消息。 有死信&#xff0c;自然就有死信队列。当一个消息在一个队列中变成死信消息之后&#xff0c;就会被重新发送到另一个交换器中&#xff0c;这个交换器就是DLX&#xff08;Dead Letter Excha…

sicp每日一题[1.1-1.29]

补一下之前的题目 Exercise 1.1 Below is a sequence of expressions. What is the result printed by the interpreter in response to each expression? Assume that the sequence is to be evaluated in the order in which it is presented. Exercise 1.2 Translate the …

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…

Vue2学习笔记(02条件渲染 、监视数据的原理)

1、v-if和v-show的区别 2、Vue监视数据的原理

8.安卓逆向-安卓开发基础-安卓四大组件1

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

Python酷库之旅-第三方库Pandas(122)

目录 一、用法精讲 541、pandas.DataFrame.take方法 541-1、语法 541-2、参数 541-3、功能 541-4、返回值 541-5、说明 541-6、用法 541-6-1、数据准备 541-6-2、代码示例 541-6-3、结果输出 542、pandas.DataFrame.truncate方法 542-1、语法 542-2、参数 542-3…