多线程JUC

news2024/12/30 1:45:21

文章目录

  • 多线程
    • 一.什么是多线程
    • 二.多线程的两个概念
    • 三.线程的实现方式
    • 四.常见的成员方法
    • 五.线程安全的问题
    • 六.死锁
    • 七.生产者和消费者

多线程

一.什么是多线程

进程:是程序的基本执行实体

理解:每一个运行的软件就是一个进程

线程:是操做系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位

理解:应用软件中互相独立,可以同时运行的功能

为什么要有多线程?

在这里插入图片描述

有了多线程就可以让程序同时做多件事情

可以提高程序的运行效率

多线程的应用场景

  • 软件中的耗时操做
  • 拷贝,迁移大文件
  • 加载大量的资源文件
  • 所有的聊天软件
  • 所有的后台进程

二.多线程的两个概念

1.并发

同一时刻,有多个指令在单个cpu上交替执行

2.并行

同一时刻,有多个指令在多个cpu上同时执行

并发和并行是有可能都在发生的

三.线程的实现方式

继承Thread类的方式

  • 定义一个类继承Thread
  • 重写run方法
  • 创建子类的对象,并启动线程

在这里插入图片描述

实现Runnable接口的方式

  • 定义一个类实现Runnable接口
  • 重写里面的run方法
  • 创建自己的类的对象
  • 创建一个Thread类对象,并开启线程

在这里插入图片描述

细节:getName()是Thread类中的方法,所以想要调用,则

需要获取到当前线程的对象,然后用这个对象去调用

利用Callable接口和Future接口的方式

**特点:**可以获取到多线程运行的结果

  • 创建一个类MyCallable实现Callable接口
  • 重写call(是有返回值的,表示多线程运行的结果)
  • 创建MyCallable的对象(表示多线程要执行的任务)
  • 创建FutureTask的对象(管理多线程运行的结果)
  • 创建Thread类对象,并启动(表示线程)

在这里插入图片描述

多线程三种实现方式对比

在这里插入图片描述

四.常见的成员方法

Thread类中常见的成员方法

在这里插入图片描述

在这里插入图片描述

细节:

1.如果我们没有给线程设置名字,线程也是有默认名字

格式:Thread-x(x是序号,从0开始)

2.如果我们要给线程设置名字,可以用set方法进行设置,也可以用构造方法进行设置

在这里插入图片描述

细节:

1.当JVM虚拟机启动之后,会自动的启动多条线程,其中有一条线程就叫做main线程

它的作用就是调用main方法,并执行里面的代码

2.哪条线程执行到sleep(),那么哪条线程就停留对应的时间

3.参数:时间,单位:毫秒

在这里插入图片描述

在计算机当中,线程的调度有两种

第一种,抢占式调度

所谓抢占式调度,就是多个线程在抢夺cpu的执行权

cpu在什么时候执行哪条线程是不确定的,执行多长时间也是不确定的,体现随机性

第二种方式,非抢占式调度

所有的线程轮流的执行

java中,采用的是第一种,抢占式调度

优先级越大,线程抢到cpu的概率就越大

优先级最低:1

最高:10

默认:5

在这里插入图片描述

在这里插入图片描述

细节:

当其他的非守护线程执行完毕之后,守护线程会陆续结束

守护线程的应用场景:

比如,聊天窗口,既可以聊天,也可以发文件

聊天看成一个线程,发文件看成另一个线程

此时,如果把聊天窗口关掉,那么发文件线程也就没有存在的必要了

所以,就可以把发文件线程设置为守护线程

在这里插入图片描述

尽可能的让出cpu

在这里插入图片描述

在这里插入图片描述

线程的生命周期

在这里插入图片描述

五.线程安全的问题

买票引发的安全问题

  • 相同的票出现了多次
  • 出现了超出范围的票

在这里插入图片描述

在这里插入图片描述

线程执行时,有随机性

同步代码块

把操做共享数据的代码锁起来

格式:

在这里插入图片描述

特点:

  • 锁默认打开,有一个线程进去了,锁自动关闭
  • 里面的代码全部执行完毕,线程出来,锁自动打开

锁对象是任意的对象,但是要保证锁对象是唯一

static Object obj = new Object();

同步代码块的两个细节

  • 锁对象一定是唯一的,一般用字节码文件对象:类名.class

  • synchronized一定要写在循环的里面

    说明:如果把synchronized写在了循环的外面,那么其他线程将没有机会去执行任务,任务都被线程一执行完了

同步方法

如果我们想把一个方法里面的所有代码都锁起来,那么就没有必要使用同步代码块了

可以把synchronized直接加到方法上,那么这个方法就是同步方法

格式:

修饰符 synchronized 返回值类型 方法名(方法参数){}

特点:

  • 同步方法是锁住方法里面的所有代码
  • 锁对象不能自己指定
    • 如果当前的方法是非静态的,它的锁对象是this,就是当前方法的调用者
    • 如果当前方法是静态的,它的锁对象是当前类的字节码文件对象

写同步方法的技巧:

先写同步代码块,然后把同步代码块抽取成一个方法

lock锁

JDK5以后提供了一个新的锁对象Lock

它的实现比synchronized有更广泛的锁定操做

它提供了两个方法:

void lock():获得锁

void unlock():释放锁

这样就可以实现手动上锁和手动释放锁

注意:

Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化

ReentrantLock的构造方法:ReentrantLock(),创建一个ReentrantLock的实例

在这里插入图片描述

六.死锁

就是在程序中出现了锁的嵌套

在这里插入图片描述

七.生产者和消费者

又叫做等待唤醒机制

生产者消费者模式是一个十分经典的多线程协作的模式

我们知道多线程的执行具有随机性

那么,现在我们学习的生产者和消费者模式就要打破这一特性,使得多个线程轮流执行

生产者:生产数据

消费者:消费数据

在这里插入图片描述

理想情况

生产者先抢到cpu的执行权,进行生产数据,然后消费者再抢到cpu的执行权,进行消费数据

消费者等待

消费者先抢到cpu的执行权,这时发现没有数据,此时消费者处于等待状态,

当消费者处于等待状态时,生产者会抢到cpu的执行权,判断是否有数据,

如果没有,则生产数据,然后唤醒消费者,消费者进行消费数据

在这里插入图片描述

生产者等待

生产者先抢到cpu的执行权,判断是否有数据,有则进行等待

在这里插入图片描述

在这里插入图片描述

编写多线程代码的套路

  • 循环
  • 同步代码块
  • 判断共享数据是否到了末尾(到了末尾)
  • 判断共享数据是否到了末尾(没到末尾)

阻塞队列方式实现等待唤醒机制

阻塞队列好比是连接生产者和消费者之间的管道

生产者可以把生产的数据放到管道当中

消费者可以在管道中获取数据进而进行消费

我们可以规定管道中最多可以放多少数据

队列:数据在管道中,好比是排队一样,先进的数据,先出去

阻塞:

放数据时,放不进去,会等着,叫阻塞

取数据时,取不到,也会等着,也叫阻塞

阻塞队列的继承结构

阻塞队列一共实现了4个接口

iterable:表示阻塞队列可利用迭代器进行遍历或者增强for循环

collection:表示阻塞队列是单列集合

Queue:表示队列

BlockingQueue:表示阻塞队列

实现类:

ArrayBlockingQueue:底层是数组,有界,创建对象时必须指定长度

LinkedBlockingQueue:底层是链表,无界

不是真正的无界,最大为int的最大值

多线程的6种状态

在这里插入图片描述

在Java虚拟机当中,关于线程的状态,真正定义的只有6种状态,是没有定义运行状态的,

因为,当线程抢到cpu时,那么此时虚拟机就会把当前线程交给操做系统去管理了,所以就没有定义运行状态

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

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

相关文章

Halcon 从基础到精通-02- 开发基于HALCON的应用

HALCON的应用通过HDevelop应用来构建原型。HDevelop的开发主要有3种形式。 Start from Scratch: 手动通过脚本,把HDevelop的代码转化为一般的编程语言。如,上一节提到,其实,每个operators,也许并不一样,需要依据HALC…

开发工具箱 —— it-tools

文章目录 开发工具箱 —— it-tools安装访问效果 开发工具箱 —— it-tools 安装 docker 安装教程:在 CentOs7 中安装宝塔面板和 Docker(包括MySQL,Redis) docker 安装命令 docker run -d --name it-tools --restart unless-st…

[unity]保存文件的路径设置

序 比如,序列化了一个数组,保存到磁盘上。 原来的路径是"D://test.bin",能跑,但是有点问题:序列化出来的文件和原项目离的太远,不好管理。 要是能保存到unity工程的文件夹里就好了。这个路径该…

c#设计模式-行为型模式 之 责任链模式

🚀简介 又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对 象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为…

学员自述:上位机编程培训经历

、大家好,我是华山编程培训中心的学员 之前是从事PLC编程工作的,在C#语言这一块是零基础,之前也尝试过自学,但对于类啊继承啊堆栈这些基本的概念始终是无法理解,直到看到华山培训的视频,并参与朱老师的直播…

番外--命令操作

------------- task00: 00:常用文件目录类命令1-18.(pwd; cd;ls; more;less;head;tail; mkdir;rmdir;cp;mv;rm&#xff1b…

pandas 笔记:asfreq

1 方法介绍 asfreq 是一个在 Pandas 时间序列数据分析中常用的方法。这个方法主要用于改变时间序列的频率。asfreq 可以帮助我们将一个时间序列从一个频率转换为另一个频率 2 基本用法 DataFrame.asfreq(freq, methodNone, howNone, normalizeFalse, fill_valueNone)3 参数说…

实验室超声波(提取)萃取技术有哪些实际的应用?

梵英超声(fanyingsonic)实验室超声波清洗机 超声波具有“空化现象”,“机械振动”以及“热效应”等特性。“空化现象”可产生瞬间几千个压力,使提取介质的微小气泡压缩、爆裂、破碎被提取原料和细胞壁,加速天然药用成分的溶出,“机…

微服务技术栈-Docker应用部署

文章目录 前言一、数据卷二、Docker 应用部署1、MySQL部署2、Tomcat部署3、Nginx部署4、Redis部署5、Kafka部署 总结 前言 之前文章讲到过,docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器,接下来我们将…

虫情测报灯——一种农业虫情防治工具

KH-CQPest虫情测报灯是一种农业虫情防治工具,它可以通过光源或药物诱虫的方式,吸引害虫撞击撞击屏,通过远红外自动处理技术,无公害杀死害虫的同时保存害虫标本,利用高像素的摄像头拍照、农业四情测报平台识别害虫&…

简单两步实现离线部署ChatGPT,ChatGPT平替版,无需GPU离线搭建ChatGPT

文末附主程序安装包和大模型参数文件~ 演示效果如下图所示: 一、使用方法 软件主要分为两个部分:GPT4ALL软件主体(主程序)模型参数(离线模型),如果使用API Key的话则不需要下载模型参数。 可以…

家居家纺经营配送小程序商城的作用是什么

家居家纺产品是每个家庭都必备的,无论商场还是小摊贩,市场中经营商家数量都比较多,而随着互联网电商发展,在实际经营中,传统线下商家也面临多个难题: 首先就是获客问题,线下渠道推广宣传方式单…

深刻解析数据库技术的要点以及应对策略 (软件设计师笔记)

😀前言 在信息化的时代背景下,数据已经成为了推动各行各业发展的核心要素之一。数据的储存、管理、维护、和获取变得尤为关键,确保信息的高效流通和决策的科学性。数据库技术,正是在这一背景下发挥着举足轻重的作用,它…

源码上分析Vue2和Vue3的响应式原理

本文节选自我的博客:源码上分析Vue2和Vue3的响应式原理 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖…

基于帝国主义竞争优化的BP神经网络(分类应用) - 附代码

基于帝国主义竞争优化的BP神经网络(分类应用) - 附代码 文章目录 基于帝国主义竞争优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.帝国主义竞争优化BP神经网络3.1 BP神经网络参数设置3.2 帝国主义竞争算…

【BI看板】Superset2.0+图表二次开发初探

Superset图表功能也很丰富了,但一些个性化的定制需求就需要二次开发了。网上二开的superset版本大多是0.xxx版本的或1.5xxx版本,本次用的是2.xxx。 源码相关说明 源码目录 superset-2.0\superset-frontend\plugins\plugin-chart-echarts 插件相关资料 官…

图片批量编辑器,轻松拼接多张图片,创意无限!

你是否曾经遇到这样的问题:需要将多张图片拼接成一张完整的画面,却缺乏专业的图片编辑技能?现在,我们为你带来一款强大的图片批量编辑器——让你轻松实现多张图片拼接,创意无限! 这款图片批量编辑器可以帮助…

IP地址划分知识点总结

目录 1.IP数据报头 2.IP地址 3.IP地址分类 4.特殊IP地址 1.IP数据报头 网络之间的互连协议(Internet Protocol,IP)是方便计算机网络系统之间相互通信的协议,是各大厂家遵循的计算机网络相互通信的规则。 IP数据报报头如下图所示: (1)版…

计算机竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于pyt…

蓝桥杯---第二讲---二分与前缀和

文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …