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

  • 目录

    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.xdnf.cn/news/145158.html

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

相关文章

devops的道法术器

devops的道法术器 道、法、术、器自上而下是系统思考的层次&#xff0c;自下而上是解决问题的层次 “道”是目标、价值观&#xff0c;对价值的定位。 快速交付价值&#xff0c;灵活响应变化&#xff0c;这是从价值层面的追求&#xff0c;或者是从第一性原理的角度来讲&#xf…

赋能企业沟通:2024年专业IM即时通讯软件的重要性不可小觑!

随着数字经济的快速发展&#xff0c;企业的沟通与协作方式正以前所未有的速度发生着变化。特别是在经历了全球疫情之后&#xff0c;远程工作和灵活办公成为了常态&#xff0c;而即使在疫情结束后&#xff0c;这种趋势也没有消退。企业对于高效、便捷、实时的沟通需求日益增长&a…

13_Python的高阶函数

高阶函数 高阶函数是Python编程中一个非常强大和有用的特性&#xff0c;它们允许程序员编写更简洁、更抽象的代码。 Python中的高阶函数是那些至少满足以下一个条件的函数&#xff1a; 接受一个或多个函数作为输入&#xff08;也就是说&#xff0c;它的参数之一是函数&#…

EI-BISYNCH协议,欧陆2000系列设备读取数据

EI-Bisynch是一种基于ANSI X3.28-2.5 A4标准的专有协议&#xff0c;用于消息框架。尽管其名称中包含“Bisynch”&#xff0c;但它实际上是一种基于ASCII的异步协议。数据通过7位数据位、偶校验和1个停止位进行传输。 4.1 术语解释 4.1.1 地址 每个仪器都有一个可配置的地址&…

大模型推理性能优化

LLM 推理的核心指标 首 Token 延迟(决定了用户体验) 延迟:从输入到输出最后一个 token 的延迟 吞吐量:每秒针对所有请求生成的 token 数(针对所有并发请求) 推理的性能卡点 1. KV-Cache 大小导致并发能力受限 LLM推理的过程是一个自回归的过程,前 i 次的token会作为…

Linux StableDiffusion下载外网插件失败, 自己下载安装

(sd) zhouyueubun:/data/sd-webui-aki-v4.9$ python webui.py 先看看使用插件时报的错 看截图就知道是SmilingWolf/wd-v1-4-vit-tagger-v2包不存在 先加载本地包&#xff0c;由于本地包没有&#xff0c;自动下载外网的包&#xff0c;需要科学上网访问外网网站哈。 https://h…

【千帆AppBuilder】零代码+组件+代码节点方式实现AI应用《法定退休年龄计算器》

欢迎来到《小5讲堂》 这是《千帆》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景创建应用基本信息角色指令引导信息 组件整体界面开始节点代码节…

tomcat服务搭建部署ujcms网站

tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包&#xff0c;并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…

绝缘子缺陷检测数据集

绝缘子缺陷检测数据集&#xff0c;2800张高清照片&#xff0c;已打好标签txt格式&#xff0c;可直接进行目标检测。7类标签&#xff1a;玻璃绝缘子&#xff0c;玻璃片脏污&#xff0c;玻璃片缺损&#xff0c;聚合物片脏污&#xff0c;聚合物片缺损&#xff0c;聚合物绝缘子&…

机器学习笔记(一)初识机器学习

1.定义 机器学习是一门多学科交叉专业&#xff0c;涵盖概率论知识&#xff0c;统计学知识&#xff0c;近似理论知识和复杂算法知识&#xff0c;使用计算机作为工具并致力于真实实时的模拟人类学习方式&#xff0c;并将现有内容进行知识结构划分来有效提高学习效率。 机器学习有…

JavaSE--零基础的开始笔记01:下载JDK以及Path环境变量的 配置

一.Java概述(觉得没必要的可以直接跳过)&#xff1a; Java是sun公司1995年推出&#xff0c;2009年被oracle收购又称为“甲骨文公司”。java之父&#xff1a;詹姆斯.高斯林 java是一门高级语言&#xff0c;接近人类语言程序易懂 。流行度很高&#xff0c;商业占用率高&#xf…

Java知识点小结3:内存回收

文章目录 对象引用强引用软引用&#xff08;SoftReference&#xff09;弱引用&#xff08;WeakReference&#xff09;考一考 虚引用&#xff08;PhantomReference&#xff09;总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…

【我的 PWN 学习手札】Tcache dup

前言 Tcache dup&#xff0c;实际上是 tcache 的 double free&#xff0c;能达到 UAF 的效果&#xff0c;实现 Tcache poisoning。 一、Tcache dup 早期 tcache 没有检查 double free&#xff0c;也没有对 counts 做检查。 对同一个大小落在 Tcachebin 的 chunk 进行 doubl…

鸿蒙媒体开发系列07——AVRecorder音频录制

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 在HarmonyOS系统中&#xff0c;多种API都提供了音频录制开发的支持&#x…

Stable Diffusion 使用详解(11)--- 场景ICON制作

目录 背景 controlNet 整体描述 Canny Lineart Depth 实际使用 AI绘制需求 绘制过程 PS打底 场景模型选择 设置提示词及绘制参数 controlnet 设置 canny 边缘 depth 深度 lineart 线稿 效果 背景 这段时间不知道为啥小伙伴似乎喜欢制作很符合自己场景的ICON。…

Codeforces Round 784 (Div. 4) Kotlin

本期封面原图 画师煮タ 大福豆 最近学了下Kotlin的基础语法 想着巩固一下就开了一把div4 最后几题没时间了还是换回了C 要不然没法AK了 Idea编译的时候最后必须加上一句main函数的调用&#xff0c;但是cf的测评机又不能加这一句&#xff0c;总是忘记注释掉所以ce了很多发&…

Leetcode Hot 100刷题记录 -Day18(反转链表)

反转链表&#xff1a; 问题描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&a…

工作中遇到的问题总结(1)

文章目录 第一题问题描述解决思路 第二题问题描述解决思路核心大表如何优化数据迁移过程是怎么样的如何将流量从旧系统迁移到新系统上 第三题问题描述解决思路 第四题问题描述解决思路方案一&#xff1a;双写机制方案二&#xff1a;基于时间戳的分流机制方案三&#xff1a;灰度…

【资料分析】刷题日记3

第一套 √ 考点&#xff1a;基期比重差很温柔的题 普通专科女生 占比 52.5% - 1.7% 50.8% 成人本专科女生 占比 57.8% - 4.6% 53.2% 相比降低了2.4% 知比重和部分量&#xff0c;求整体在花生老师的解法中体会啥叫适当约分 0.1899 / 47.8% / 87.5% 》0.19 / &#xff08;4…

MySQL高阶1890-2020年最后一次登录

目录 题目 准备数据 分析数据 题目 编写解决方案以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 不 包含 2020 年没有登录过的用户。 返回的结果集可以按 任意顺序 排列。 准备数据 Create table If Not Exists Logins (user_id int, time_stamp …