JAVA- 多线程

一,多线程的概念

1.并行与并发

  • 并行:多个任务在同一时刻在cpu 上同时执行
  • 并发:多个任务在同一时刻在cpu 上交替执行

2.进程与线程

进程:就是操作系统中正在运行的一个应用程序。所以进程也就是
“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看
到进程)

线程:是程序运行的基本执行单元。当操作系统执行一个程序时,
会在系统中建立一个进程,该进程必须至少建立一个线程(这个线
程被称为主线程)作为这个程序运行的入口点。因此,在操作系统
中运行的任何程序都至少有一个线程。  

3 多线程

指从软件或者硬件上实现多个线程并发执行的技术

具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个
线程,提升性能

好处 : 提高程序的效率

二.多线程创建方式

1 创建方式一:继承Thread方式

ava.lang.Thread 是线程类,可以用来给进程创建线程处理任务使
用。两个比较重要的方法:

  • public void run() : 线程执行任务的方法,是线程启动后第一个执行的方法
  • public void start() : 启动线程的方法, 线程对象调用该方法后,Java虚拟机就会调用此线程的run方法。

基本步骤:

创建一个类继承Thread类。
在类中重写run方法(线程执行的任务放在这里)
创建线程对象,调用线程的start方法开启线程。
 

2 创建方式二:实现Runable接口方式

第二种创建方式使用如下构造方法,指定任务给线程执行,参数中
的Runnable是一个接口,用来定义线程要执行的任务。

  • public Thread(Runnable target)
  • public Thread(Runnalbe target , String name)

实现步骤
定义任务类实现Runnable,并重写run方法
创建任务对象
使用含有Runnable参数的构造方法,创建线程对象并指定任
务。
调用线程的start方法,开启线程。

3 两种创建线程方式对比

方式优点缺点
实现
Runnable
扩展性强,实现该接口
的同时还可以继承其他
的类
编程相对复杂,不能
直接使用Thread类中
的方法
继承
Thread
编程比较简单,可以直
接使用Thread类中的方
可扩展性较差,不能
再继承其他的类

三.Thread类常用方法

  • 获取线程的名字:String getName()
  • 设置线程的名字:void setName(String name);通过构造方法也可以设置线程名称
  • 获得当前线程的对象:public static Thread currentThread()
  • 让线程休眠指定的时间,单位为毫秒:public static voidsleep(long time)

四.线程安全问题

1 线程安全问题演示

题:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票(窗口1,窗口2,窗口3),请设计一个程序模拟该电影院卖票总共有3种卖票途径,就相当于有3个线程这100张票被这3个线程共享使用,属于共享数据这3个线程的任务相同:都是卖票

实现步骤

定义线程任务类实现Runnable接口
Runnable接口实现类(线程任务类)覆盖重写抽象run方法,指定

  • 线程任务:卖票
  • 判断是否有票
  • 如果有票:打印输出这一张票的票号

票的数量减少1
创建线程任务类的对象
创建3个线程对象,构造方法分别传递线程任务对象
3个线程对象分别调用start方法,开启线程

卖票出现了问题

  • 相同的票出现了多次
  • 出现了负数的票

问题原因:多个线程在对共享数据进行读改写的时候,可能导致的
数据错乱就是线程的安全问题了

2 卖票案例数据安全问题的解决

思路::让共享数据存在安全的环境中 , 当某一个线程访问共享数
据时 其他线程是无法操作的

把多条线程操作共享数据的代码给锁起来,让任意时刻只能有一个
线程执行即可。Java提供了同步代码块的方式来解决。

方法1:

  • 默认情况锁是打开的,只要有一个线程进去执行代码了,锁就会关闭
  • 当线程执行完出来了,锁才会自动打开
  • 锁对象可以是任意对象 , 但是多个线程必须使用同一把锁

好处:解决了多线程的数据安全问题

弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这
是很耗费资源的,无形中会降低程序的运行效率

方法2:

把synchronized关键字加到方法上,保证线程执行该方法的时候,其他线程只能在方法外等着

同步代码块和同步方法的区别:

  • 同步代码块可以锁住指定代码,同步方法是锁住方法中所有代码
  • 同步代码块可以指定锁对象,同步方法不能指定锁对象

同步方法时不能指定锁对象的 , 但是有默认存在的锁对象的

  • 对于非static方法,同步锁就是this
  • 对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。 Class类型的对象

 Lock锁机制

Lock中提供了获得锁和释放锁的方法

  • void lock():获得锁
  • void unlock():释放锁

 

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

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

多个线程使用相同的Lock锁对象,需要多线程操作数据的代码放在lock()和unLock()方法之间。一定要确保unlock最后能够调用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】子序列问题二(数组中不连续的一段)

子序列问题二 1.最长定差子序列2.最长的斐波那契子序列的长度3.最长等差数列4.等差数列划分 II - 子序列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&am…

如何提取 R 语言内置数据集和著名 R 包的数据集

大家好,今天我们来聊一聊在 R 语言中如何提取内置数据集,以及如何使用著名 R 包中的数据集。相信很多同学在学习 R 语言时,都会遇到需要用数据集来做练习或者分析的情况。在 R 里,数据集资源非常丰富,R 本身自带了许多…

跨部门SOP与统一知识库:打破信息孤岛,促进团队协作

引言: 在当今这个快速变化且高度竞争的商业环境中,企业面临着前所未有的挑战,其中之一便是如何高效地跨越部门界限,实现无缝协作。传统的组织结构往往导致信息孤岛的出现,不同部门间流程不一致、信息不共享&#xff0…

shader 案例学习笔记之step函数

step函数 step(edge,x):当x>edge时返回1,否则返回0 #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution;void main(){vec2 st gl_FragCoord.xy/u_resolution.xy;float f step(0.5, st.x);gl_FragColor vec4(f, 0, 0, 1.0); …

yolo训练出现Could not load library libcudnn_cnn_train.so.8问题及解决方法

问题场景: 训练yolov5或者yolov8时候会报错: Could not load library libcudnn_cnn_train.so.8. Error: /usr/local/cuda-12.1/lib64/libcudnn_cnn_train.so.8: uined symbol: _ZN5cudnn3cnn34layerNormFwd_execute_internal_implERKNS_7backend11Vari…

web前端-HTML常用标签(三)

一、表格标签 表格是实际开发中非常常用的标签: 1.表格的主要作用: 表格主要用于显示、展示数据,因为它可以让数据显示的非常的规整,可读性非常好。特别是后台展示数据的时候,能够熟练运用表格就显得很重要。一个清爽简约的表格…

火柴人跑酷

运行图片: 这里面有三个boss,和各种元素属性列举一下: 元素作用 火 运用火元素将攻击抵消 水 和火元素一致 磁 自动吸取经验…

MySQL数据表操作

目录 常用数据类型 数值类型 整型 浮点型 字符串类型 日期类型 数据表的操作 查看表结构 创建表 约束 删除表 修改表 添加列 删除列 修改列的定义 重命名列 重命名表 总结 在学习了数据库操作之后,我们接着来看数据表的相关操作 我们首先来学习 …

农产品管理与推荐系统Python+Django网页界面+计算机毕设项目+推荐算法

一、介绍 农产品管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的…

乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数2007-2021年

2007-2021年乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数.zip资源-CSDN文库https://download.csdn.net/download/2401_84585615/89504677 本文分析的数据集涵盖了中国31个省区市的乡村旅游相关指标,包括从业人数、美丽乡村数量、乡村旅游示…

MPLAB V8.92烧写hex

打开hex文件 File\Import … *.hex文件2. 选择烧录器 Programmer\Select programmer -PICKit3/MPLAB ICD2 3.烧录程序 Programmer\program

ES6标准---【三】【学习ES6看这一篇就够了!!!】

目录 ES6以往文章 ES6之前函数默认值参数的处理方法 ES6函数参数的默认值 与结构赋值默认值结合使用 参数默认值的位置: 函数的length属性 作用域 参数的默认值是一个函数 正确理解函数默认值的例子 应用 指定某一个函数参数不得省略,如果省略…

大模型LLM:合成训练样本的数据分布问题

近几天在研究大模型LLM数数问题时,使用合成数据集来训练LLM“统计字符串(100个单词以内)中字母的个数”的能力,基于Word进行分词。原始的合成代码在生成随机字符串时,采用如下代码: # self.words为常见英文…

Python安装llama库出错“metadata-generation-failed”

Python安装llama库出错“metadata-generation-failed” 1. 安装llama库时出错2. 定位问题1. 去官网下载llama包 2.修改配置文件2.1 解压文件2.2 修改配置文件 3. 本地安装文件 1. 安装llama库时出错 2. 定位问题 根据查到的资料,发现时llama包中的execfile函数已经…

在职研生活学习--20240907

开学第一天 9月7日,中南大学商学院迎来了一支充满活力的队伍——2024级MBA新生集体整装待发,我们满怀期待地登上了前往长沙望城柏乐园的大巴,准备开启一场为期两天一夜的素质拓展与团队建设之旅。 迎新幼儿园PPT 出发 抵达柏乐园,…

Kubernetes------Service

目录 一、属性说明 二、定义和基本配置 1、定义 2、创建Service 2.1、typeClusterIP 2.2、typeNodePort 2.3、固定IP访问 三、Service、EndPoint、Pod之间的关系 四、服务发现 1、基于Service中IP访问外部服务 2、基于Service中域名访问外部服务 五、Ingress的安装和使…

Caffenie配合Redis做两级缓存

一、什么是两级缓存 在项目中。一级缓存用Caffeine,二级缓存用Redis,查询数据时首先查本地的Caffeine缓存,没有命中再通过网络去访问Redis缓存,还是没有命中再查数据库。具体流程如下 二、简单的二级缓存实现-v1 目录结构 2…

合宙低功耗4G模组AIR780EX ——开发板使用说明

EVB-AIR780EX 开发板是合宙通信推出的基于 Air780EX 模组所开发的,包含电源,SIM 卡,USB,天线,等必要功能的最小硬件系统。 以方便用户在设计前期对Air780E模块进行 性能评估,功能调试,软件开发…

请教一下,安恒信息为什么2024年上半年巨亏2.76亿元?

【科技明说 | 科技热点关注】 根据公开的财务报告来看,安恒信息2024年上半年实现营业总收入6.98亿元,同比增长0.29%。尽管公司在数据安全、商用密码和信创安全等核心业务领域实现了较快增长,但整体上仍然面临亏损。 目前来看&…

blender云渲染来了,blender云渲染教程!

朋友们,成都渲染101农场blender云渲染上线了,继3DMAX/C4D/maya/UE5云渲染上线后,又上线了blender云渲染,今天,成都渲染101渲染农场用四步教会您blender云渲染! 第一步,云渲码6666注册个渲染101…