当前位置: 首页 > news >正文

JAVA基础(JAVA SE)学习笔记(十)多线程

 前言 

1. 学习视频:

尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili

2023最新Java学习路线 - 哔哩哔哩

第三阶段:Java高级应用

9.异常处理

10.多线程

11.常用类和基础API

12.集合框架

13.泛型

14.数据结构与集合源码

15.File类与IO流

16.网络编程

17.反射机制

18.JDK8、17 新特性

正文

10.多线程

10.1 多线程的理解

程序、进程、线程区分:

举例:

线程调度:

10.2 多线程的创建方式

10.2.1 多线程的创建方式一:继承Thread类

举例:创建一个分线程1,用于遍历100以内的偶数。

可以看到创建的线程和main的线程在交互执行。还可以看到线程名如上。

 System.out.println(Thread.currentThread().getName()+":"+i+"***********");System.out.println(Thread.currentThread().getName()+":"+i);

例二:

创建Thread类的匿名子类的匿名对象:

10.2.2 多线程的创建方式二:实现Runnable接口(建议使用方式)

或:

声明了两个线程,但是只声明了一个EvenNumberPrint类,相当于共享数据。

相当于 代码逻辑(新建线程执行任务)  和 数据(一个EvenNumberPrint类)的分离

两种创建线程的方式对比:

练习题:

10.3 继承Thread类的常用方法

10.3.1 构造器

Thread中:

使用举例:

10.3.2 常用方法

使用举例:

  

10.3.3 优先级(Priority)

10.3.4 多线程的优点

10.4 生命周期

现在JDK17,线程的状态如下:

新建、准备、运行、阻塞(锁阻塞、无限等待、计时等待)、死亡。

public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;}

运行(Runnable):Ready、Running。

阻塞分为三种状态:

        锁阻塞(BLOCKED)、无限等待(WAITING)、计时等待(TIMED_WAITING)。

死亡(terminated)。

10.5 买票案例,引出线程安全问题,引出同步机制

线程不安全,已卖过的票,还会被再次售卖。加上static共享变量,也不行。

10.5.1 使用synchronized同步机制处理线程安全问题

同步代码块:

同步监视器用在循环内部,保证了每次售票时,三个线程随机排队进入监视器内部,执行买票,模拟了三个窗口售票。如果把循环体整个加入监视器,则三个窗口只随机排队一次,然后售空才能结束循环,进入下一次排队,不符合实际。

使用快捷键,生成环绕方式synchronized监视器,然后直接在小括号内写this。

在继承Thread类后,假如声明三个子类对象,要用static修饰作为同步监视器的Object类,使三个子类共享数据。保证唯一性,使用当前类.class,即Window.class

同步方法:

 public static synchronized void xxx(){ //操作共享数据的代码  }

此时的同步监视器,默认的就是this(调用者)。在下列代码中,this是唯一的,因为只新建了一个SaleTicket2类的对象。三个线程的共享对象是同一个。

继承:

如下:三个线程,没有共享对象,是三个不同对象。this有三个。

synchronized的优缺点:

习题:

sleep在哪执行,哪个线程就进入阻塞。(主线程内执行sleep方法,主线程阻塞5秒)

10.5.2 线程安全的懒汉式

两个线程获取Get方法创建单例的实例对象,线程不安全,创建了两个实例对象。需要添加Synchronized,得到同步方法。

方法二:同步代码块   和   方式三:同步代码块 优化(进监视器之前多加一层判断,效率更高)

使用volatile避免指令重排:

将instance声明为volatile,可以避免在第一个线程正在创建的时候,还没有地址,第二个线程判断第一个线程已经非空,就返回instance,造成返回空值。

10.5.3 线程的同步机制带来 死锁问题

死锁示例:

不睡眠,则很快执行,没有死锁。睡眠诱发死锁概率提高,发现有死锁问题,不能运行出结果。

10.5.4 使用jdk5.提供的Lock锁的方式 处理线程安全问题

目前创建ReentrantLock(重新re进入entrance 锁lock)的对象:

   //private:外部不可访问;//static:几个线程共用同一个锁;//final:赋值之后不可修改。private static final ReentrantLock lock = new ReentrantLock();

检查'在使用阻塞等待获取锁的方式中,必须在try代码块之外,并且在加锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在finally中无法解锁
说明一:如果在lock方法与try代码块之间的方法调用抛出异常,那么无法解锁,造成其它线程无法成功获取锁。
说明二:如果lock方法在try代码块之内,可能由于其它方法抛出异常,导致在finally代码块中,unlock对未加锁的对象解锁,它会调用AQS的tryRelease方法(取决于具体实现类),抛出IllegalMonitorStateException异常。
说明三:在Lock对象的lock方法实现中可能抛出unchecked异常,产生的后果与说明二相同。 java.concurrent.LockShouldWithTryFinallyRule.rule.desc

Positive example:Lock lock = new XxxLock();// ...lock.lock();try {doSomething();doOthers();} finally {lock.unlock();}

synchronized不管是同步代码块还是同步方法,都需要在结束一对{}之后,释放对同步监视器的调用。Lock是通过两个方法控制需要被同步的代码,更灵活一些。

Lock作为接口,提供了多种实现类,适合更多更复杂的场景,效率更高。

在JUC会详细讲解LOCK。

10.6 线程的通信

wait()和notify():

能不能使下面两个线程交替打印1~100之间的数:

线程一执行到notify(),不需要唤醒,继续执行,然后打印数字,执行wait()。

线程二执行到notify(),本身不需要唤醒,但唤醒线程一,线程二继续执行,打印数字,执行wait()。线程一被唤醒后继续执行wait()后面的代码else,然后重新执行到notify(),本身不需要唤醒,但唤醒线程二。

wait()和sleep()的区别:

习题:

10.7 多线程的创建方式三:实现Callable接口(JDK5.0新增)(了解)

t1.start()执行之后,分线程开始打印1~100以内的偶数,主线程开始去调用futureTask.get()方法,打印总和。若分线程阻塞(例如加上:Thread.sleep(1000);),则主线程获取的总和结果就会不正确。

其实不是这样的,t1.start()执行之后,分线程开始打印1~100以内的偶数,主线程开始去调用futureTask.get()方法会暂时阻塞,等待return操作的结果。而return操作需要等分线程打印1~100以内的偶数执行完毕,然后才return,主线程才会打印总和。

10.8 多线程的创建方式四:使用线程池(开发中使用)

总结:

栈管运行,堆管存储。所以线程在栈里。

非静态方法同步监视器,默认的就是this(调用者对象)。

非静态方法同步监视器,默认的就是this(调用者对象)。如下,t1线程进入了一个对象SaleTicket1的synchronized方法之后,其他线程例如t2就还能进入对象SaleTicket1的其他方法,因为两个同步监视器的this分别是不同的实例对象s和s1。而且都是唯一的。但是t3和t1的this是同一个,所以不能访问此对象实例s的其他方法。发挥了同步代码块的作用,避免了线程安全问题。

阻塞还可能是sleep()、wait()、join()、suspend()了。

自己练习一下。

相关文章:

JAVA基础(JAVA SE)学习笔记(十)多线程

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段:Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…...

ChatGPT参数只有200亿?扩散代码模型,意外泄露

微软的研究部门发布了一篇关于预训练扩散代码模型CodeFusion的论文。在展示代码生成任务的基线数据对比时,发现了一个有趣的事情,ChatGPT(gpt-3.5-turbo)的参数只有200亿。 要知道,gpt-3.5-turbo是OpenAI中应用最多、…...

VR虚拟仿真教学在建筑学课堂中的应用

1. 增强真实感:VR技术能创造出近乎真实的虚拟环境,使学生仿佛置身其中,增强他们的感官体验。 2. 打破空间限制:VR教学可以打破时间和空间的限制,学生可以在任何时间、任何地点进行学习,无需担心课堂位置的…...

竞赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向&#xff0c…...

当代都市的时尚先锋:气膜建筑的魅力

当代城市的崛起如一部快速奔腾的时光流。在这个光速发展的都市中,时间被看作珍贵的黄金,而效率被视为无价的生命。而在这个节奏日益加快的现代都市背后,一个独特的“神器”——气膜建筑,悄然崭露头角,成为城市发展的领…...

品牌加盟商做信息展示预约小程序的效果如何

很多行业都有中部或头部品牌,对实体品牌企业来说想要快速高效发展,除了多地直营店外还需要招募加盟商进而提升生意营收。 因此线上渠道变得尤为重要,除了网站外,小程序是连接多平台生态很好的工具,随时打开、直接触达…...

delphi 11.3 FastReport 多设备跨平台 打印之解决方法

以下能WINDOWS10 DELPHI 11.3 FastReport6.0上顺利通过 FastReport6.2对Multi-Device Application应用的支持不够友好,如下图;在palette FastReport6.0才出现几个制件。 非Multi-Device Application应用时是一大堆; 非Multi-Device Appl…...

配置vue 环境

一、安装Node.js及配置环境 环境变量配置 第一步:“此电脑”-右键-“属性”-“高级系统设置”-“高级”-“环境变量” 第二步(我的为:C:\Program Files\nodejs ),然后编辑path,新建,为&#xf…...

Visio文件编辑查看工具Visio Viewer for Mac

Visio Viewer mac版是一款Visio文件查看工具,可以使用本程序打开所有的visio文件数据,支持多种语言环境,可以对visio文件进行编辑、跳转参数等设置。 Visio Viewer for Mac可以打开和查看Visio文件(.vsd、.vdx和.vsdm文件&#x…...

现在软文发布平台都有哪些?如何在正规媒体发稿?

近年来,随着广告行业竞争愈加激烈,越来越多的企业开始注重软文宣传。软文推广平台是企业在网络上发布软文、传播信息和推广产品的重要工具。 媒介易软文平台介绍更好的品牌宣传和市场推广:软文推广发稿有哪些平台, 软文发稿好方法?软文不仅能…...

【卷积神经网络】YOLO 算法原理

在计算机视觉领域中,目标检测(Object Detection)是一个具有挑战性且重要的新兴研究方向。目标检测不仅要预测图片中是否包含待检测的目标,还需要在图片中指出它们的位置。2015 年,Joseph Redmon, Santosh Divvala 等人…...

云计算与ai人工智能对高防cdn的发展

高防CDN(Content Delivery Network)作为网络安全领域的一项关键技术,致力于保护在线内容免受各种网络攻击,包括分布式拒绝服务攻击(DDoS)等。然而,随着人工智能(AI)和大数…...

Web3时代:探索DAO的未来之路

Web3 的兴起不仅代表着技术进步,更是对人类协作、创新和价值塑造方式的一次重大思考。在 Web3 时代,社区不再仅仅是共同兴趣的聚集点,而变成了一个价值交流和创新的平台。 去中心化:超越技术的革命 去中心化不仅仅是 Web3 的技术…...

odbcinst文件

odbcinst文件是ODBC(Open Database Connectivity)驱动程序管理器的配置文件。ODBC是一种标准的数据库访问接口,允许应用程序通过统一的方式连接和访问不同类型的数据库。 odbcinst文件通常位于操作系统的特定目录中,并且用于定义…...

(CQUPT 的某数据结构homework)

CQUPT 的某数据结构homework 基于线性表的图书信息管理基于栈的算术表达式求值基于字符串模式匹配算法的病毒感染检测问题 基于哈夫曼树的数据压缩算法基于二叉树的表达式求值算法基于 Dijsktra 算法的最短路基于广度优先搜索的六度空间排序算法的实现与分析 基于线性表的图书信…...

Android页面周期、页面跳转

1.什么是Activity? Activity是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互。Activity用于显示用户界面,用户通过Activity交互完成相关操作,一个APP允许有多个Activity。 2.Activi…...

腾讯云轻量应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像介绍

腾讯云轻量应用服务器镜像类型分为应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像,腾讯云百科txybk.com来详细说下不同镜像类型说明和详细介绍: 轻量应用服务器镜像类型说明 腾讯云轻量应用服务器 应用镜像:独有的应用镜像除了包…...

YOLOv8芒果独家首发 | 改进新主干:改进版目标检测新范式骨干PPHGNetv2,百度出品,提升YOLOv8检测能力

💡本篇内容:YOLOv8改进新主干:目标检测新范式骨干PPHGNetv2改进版,百度出品,提升YOLOv8检测能力 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv8专属,充分结合YOLOv8和 PPHGNetv…...

工作测试点

智能硬件的兼容性测试 通常涉及以下几个方面: 硬件兼容性测试:测试智能硬件是否与不同类型的设备(如电脑、手机、平板电脑等)硬件兼容。这包括测试设备的接口类型(如USB、HDMI、Bluetooth等)是否能够正确连…...

智慧医院—互联网医院系统带你体验数字化时代

智慧医疗作为当今医疗领域的新热点,也将在未来中得到充分展现。包括智慧医院、远程医疗、医疗大数据等多个方面,这些智慧医疗新产物和服务将改变传统的医疗模式,提供更加高效、便捷的医疗服务。 1、远程医疗服务:智慧医疗为患者提…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...