【Java】韩顺平Java学习笔记 第17章 多线程基础

韩顺平老师讲解13个自学编程的坑 文章目录前言内容误区一 不注重基础,什么技术火就学什么误区二 总是纠结学最好的编程语言误区三 喜欢看不喜欢动手误区四 没有认识到,听懂和能使用时两回事误区五 很少做笔记,也不去画思维导图,没有将学到的知识转换成自己的知识误区六 喜欢死记硬背,而不是理解原理误区七 程序出错了,不是积极的调试错误,而是逃避误区八 孤军奋战,闭门造车,不愿意也不敢分享误区九 什么都想学,什么都没精通,天天疲于奔命在学各种技术,最后整个知识体系没有建立起来。误区十 收集各种学习资源,但几乎不看误区十一 我是女生,我不适合编程误区十 阅读详情

第17章 多线程基础

基本概念

  • 程序:编写的指令集合,其实就是我们写的代码
  • 进程:运行中的程序
  • 线程
    • 单线程
    • 多线程
  • 并发
  • 并行

线程使用

继承 Thread 类

  • 重写 run 方法(来自 Runnable 接口,Thread 类是实现了 Runnable 接口的 run 方法),写上自己的业务逻辑
  • 当类继承 Thread 类,该类就可以当做线程
  • sleep 休眠方法(必须有异常处理)
  • start 启动线程方法,调用 run 方法(为什么不直接调用 run 方法?)
  • currentThread().getName() 获取当前线程
多线程机制
  1. 运行程序后,创建了这个程序的进程
  2. 进入主方法后,这个进程创建了一个主线程(main线程)
  3. 当主线程内再新建了一个继承 Thread 类的对象,这时主线程创建了一个子线程
  4. 子线程运行的同时,主线程不会阻塞,仍然继续执行
  5. 当主线程运行完后,会终止消失,但若主线程的子线程还没有执行完,子线程不会消失,而是继续执行。当所有线程结束后,进程才会结束
  6. 可以使用 Jconsole 监控线程执行情况
为什么是 start 方法?
  • 主线程直接调用 run 方法,则 run 方法会被当作一个普通的方法,主线程要执行完 run 方法后才会执行主线程剩余的代码,即主线程被阻塞。故直接调用 run 方法,没有真正地创建一个子线程,必须调用 start 方法
  • start 源码里会执行 start0 方法是本地方法(native方法),由 jvm 机和操作系统 调用
  • 调用 start0 方法后,只是将线程变成了可运行状态,具体什么时候上 CPU 执行,需要根据操作系统的调度算法
  • 调用 start 方法才会创建新线程,start 调用 run 方法不会创建新线程

实现 Runnable 接口(建议使用)

  • Java 是单继承的,如果一个类已经继承了其他类,这时只能直接实现 Runnable 接口
  • 直接实现时,没有 start 方法(不能直接调用 run 方法!)
  • 解决方式是创建一个 Thread 对象,将实现 Runnable 接口的对象放进去,再通过 Thread 对象调用 start 方法
    Thread thread = new Thread(dog);
  • 底层使用静态代理设计模式
  • 可以让两个线程来执行一个实现 Runnable 接口的对象,更适合多个线程共享一个资源的情况

线程终止

终止的两种方式

  • 线程完成任务时
  • 通过使用变量来控制 run 方法退出(修改线程类里的循环判断变量),即通知方式

线程常用方法

用户线程和守护线程

  • 用户线程
  • 守护线程(举例:垃圾回收机制)——怎么设置守护线程?setDaemon方法

常用方法

  • setName

  • getName

  • interrupt 中断线程,但并没有真正结束线程,只是进入休眠状态(sleep)

    如果线程正在休眠,则结束休眠(一般用法)

  • setPriority 设置优先级**(优先级一般用于进程调度算法)**

    • MIN_PRIORITY = 1(最低)
    • NORM_PRIORITY = 5(普通)
    • MAX_PRIORITY = 10(最高)
  • getPriority

  • start

  • run

  • sleep

  • yield 线程礼让(让出CPU让其他进程执行,但不保证成功,因为有时内核资源不紧张,CPU觉得没有必要礼让。且礼让时间不确定)

  • join 线程插队,即抢占(一旦插队成功,则肯定先执行完插入的线程的所有的任务,即使是主线程也暂时不执行)

线程的生命周期

线程状态
  • 官方文档有6种
    • New
    • Runnable(就绪态,可分为两个状态,这就是某些书上说7种状态的由来)
      • Ready
      • Running
    • Blocked(阻塞)
    • Waiting
    • TimedWating(超时等待)
    • Teminated(终止)
  • 某些书上说的是7种
  • 查看状态用 getState 方法

线程同步

  • 线程同步机制概念

Synchronized 关键字 —— 实现同步的具体方法

  • 同步代码块(建议选择,范围较小,效率尽可能高)

    synchronized (对象) { //得到对象的锁,才能操作同步代码
    //需要被同步的代码
    }
    
  • 放在方法声明种,表示为同步方法

    public synchronized void func(String name){
    	//需要被同步的代码
    }
    

互斥锁

  • 是一个标记
  • 用 synchronized 修饰时,拥有互斥锁
  • 同步局限性:效率降低
  • 非静态同步方法的锁可以加在 this(这个对象),也可以加在其他对象(要求是线程使用的是同一个对象、共享的对象,即这个其他对象来当锁,这个对象不能有很多个。如果有很多个,虽然锁住了,但是每个线程都能抢到锁,实际上相当于没锁住)
  • 静态同步方法的锁只能加在类本身(类名.class)
  • 同步方法如果没有使用static修饰:默认锁对象为this
  • 如果方法使用static修饰,默认锁对象:当前类.class
  • 注意多个线程的锁对象必须是同一个!

线程死锁

  • 死锁概念

释放锁

释放锁的情况
  • 当前线程的同步方法、同步代码块执行结束
  • 当前线程的同步方法、同步代码块遇到break、return
  • 当前线程的同步方法、同步代码块出现了未处理的Error或Exception,导致异常结束
  • 当前线程的同步方法、同步代码块执行了线程对象的wait()方法,当前线程暂停,并释放锁
不会释放锁的情况
  • 当前线程的同步方法、同步代码块调用 sleep、yield 方法

  • 执行同步代码块时,其它线程调用该线程的挂起方法 suspend(使其进入到就绪态)

    注:尽量避免使用 suspend 和 resume 方法,已不再推荐使用

韩顺平Java学习笔记:从基础到实战 Java程序由类和对象组成,其中类是对象的蓝图。一个Java程序至少包含一个类,通常包含一个主类,其包含main方法作为程序入口点。Java文件命名通常与公共类名相同,并以.java后缀结束。示例代码:");在Java语言中,类是创建对象的蓝图,它定义了将要创建的对象的状态(属性)和行为(方法)。类的定义使用关键字class,后跟类名,以及类体(用大括号{}包围的部分)。// 类的属性// 类的构造方法// 类的方法// 对象的创建对象是类的实例,通过关键字。 阅读详情

相关推荐

韩顺平Java编程完全手册

Java语言是一种静态类型语言,这意味着所有的变量在使用之前都必须声明其类型。Java的数据类型可以分为两大类:基本数据类型和引用数据类型。基本数据类型包括数值类型(整型、浮点型)、字符类型(字符型)和布尔类型。这些类型的数据直接存储在栈中,它们的值直接表示数据本身,而不是指向数据的引用。整型:包括byte、short、int和long四种类型,它们分别占用8、16、32和64位的空间。浮点型:包括float和double两种类型,分别表示单精度和双精度浮点数。字符型。

weixin_30838971的博客 1120

韩顺平Java学习笔记_线程专题(基础)

韩顺平Java学习笔记_多线程基础专题

m0_62661440的博客 646

Pspice开关电源仿真:从零实现反激式电源设计实战案例

通过Pspice仿真工具,手把手实现反激式开关电源的设计与优化,深入剖析关键参数设置与波形分析,帮助掌握Pspice在电源开发中的实际应用技巧。

weixin_35756690的博客 1155

java线程基础(韩顺平)

1.程序指的是代码,静态 2.进程是一个程序的执行过程 3.线程是由线程创建的,是进程的一个实体,一个进程可以拥有多个线程 举例:一个迅雷的多个下载任务,一个qq的多个聊天窗口 4.并发:宏观并行,微观串行 并行:多个同时,多核cpu可以1.继承Thread类,重写run方法 2.直接绕过Thread类,实现Runnable接口,重写run方法 一个类继承Thread类(或实现Runnable接口),重写run方法,写上自己的业务代码,就成为了线程。 在主函数里,调用这个对象的start方法(相当于调run

fangshyv的博客 318

医学图像中的小目标病灶检测难题:我的硕士研究总结与思考

医学图像中的小目标检测和分割,主要指在CT、MRI、超声等医学影像中识别和分割微小病灶或细小结构。这些小目标通常体积小、边界模糊、特征不明显,却往往是关键病灶,例如肺部小结节、脑微出血、乳腺微钙化等。

weixin_45638136的博客 2368

codevs 1620 轮船问题 DP 解题报告

某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市。

Hawo11的博客 815

【韩顺平】Java线程(基础)知识点总结

此篇文章总结自韩顺平老师所讲解的Java线程内容,我将会在引用韩老师原文的基础上增加自己的一些解读,以加深各位小伙伴对于Java线程的理解。希望能为各位学习Java的小伙伴带来帮助。

m0_66908465的博客 2098

山东大学软件测试实验2——系统功能测试

​ 给出一个被测试的 Web 应用系统(SUT)。http://211.87.232.162:8080/注:友情链接不用延伸测试。针对被测试的 Web 应用系统进行功能测试,发现其存在的缺陷。 ​

m0_74033391的博客 2409

Java 线程基础

线程 Thread Synchronized 互斥锁 进程 并行 并发 死锁

qq_42411696的博客 238

Unity 多线程编程笔记 _Task详解

士大夫

weixin_43405845的博客 4384

智慧安防:基于Java+YOLOv8的视频AI识别平台设计与实现

张工,我们的园区智慧安防项目又出问题了!用Python写的YOLOv8 demo,拉3路RTSP流就卡,视频延迟超过5秒,入侵检测误报率太高,一到晚上光线差就全是误报,而且和我们的Java安防平台对接太麻烦,还要搭个消息队列,架构复杂得要死!“别慌,用Java+YOLOv8啊!

2601_94871597的博客 196

java多线程(韩顺平老师讲义)

多线程(韩顺平) 进程:正在运行的程序 加载到内存里 线程是进程的实体,线程也可以由线程创建 单线程:同一时刻只能有一个线程 并发:同一时刻多个任务交替执行 1,继承Thread类(这个类也是实现runable接口 ) run()方法是普通方法,没有启动新的线程 接口是一个规范 我知道你的方法名, 我才知道找什么去调用什么 [1] native 本地方法start0() 底层C/C++实现 start0()==>线程可用,具体什么时候run。不知道等CPU调度。

weixin_44623449的博客 608

自动驾驶系统研发系列—全智能驾驶新高度:深入解析车道保持辅助(ELK)功能

车道保持辅助系统(ELK)是一种基于先进视觉感知技术的主动安全系统,能够通过车载摄像头实时监测道路上的车道线、道路边缘以及周围车辆的位置。这一功能的核心在于为驾驶员提供智能化的安全辅助,尤其是在驾驶员可能因疲劳、分心或其他原因无意识地偏离车道时,系统能够主动干预,从而避免危险发生。ELK系统不仅仅依靠摄像头对道路进行感知,还结合其他传感器的数据(如雷达),实时评估自车与车道线、周边车辆的相对位置。当系统检测到车辆即将偏离车道,或越过道路边缘时,ELK会通过控制电子助力转向系统(EPS)

u013889591的专栏 1211

韩顺平 2021零基础学Java 学习笔记

韩顺平 2021零基础学Java 学习笔记(1)(自用)_丨shallow丨的博客-优快云博客_韩顺平java笔记韩顺平 2021零基础学Java 学习笔记(2)(自用)_丨shallow丨的博客-优快云博客 韩顺平 2021零基础学Java 学习笔记(3)(自用)_丨shallow丨的博客-优快云博客 韩顺平 2021零基础学Java 学习笔记(4)(自用)_丨shallow丨的博客-优快云博客 韩顺平 2021零基础学Java 学习笔记(5)(自用)_丨shallow丨的博客-优快云博客

大雾起了清晨 8920

2020年大连理工大学《单片机原理及应用》期末试卷

2020年大连理工大学《单片机原理及应用》期末试卷 此试卷为大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷。 ...

无名何许人的博客 1478

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

韩顺平Java高级课程【超全资料】——深入浅出的编程艺术

我非常兴奋地在这里分享一个宝贵的资源——韩顺平老师的Java全部课程资料。对于正在学习Java的同学们,这无疑是一个不容错过的机会。

m0_71672987的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

韩顺平老师坦克大战优化版

目录一、项目介绍1、前言2、涉及知识点3、关键代码4、运行数据二、主要优化方面1、系统常量2、用线程池管理线程3、采用线程安全集合类4、控制坦克发射频率5、敌方自动追击我方6、避免坦克重叠7、生成一组不重复随机整数8、统计数量时采用原子类一、项目介绍 1、前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化。编码上尽量按照阿里的代码规约;有非常详尽的注释;引入了线程池,线程安全集合类,原子类...

土味儿 2847

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

韩顺平 2021零基础学Java 学习笔记(1)(自用)

目录第 2 章 Java 概述第 3 章 变量第 4 章 运算符第 5 章 程序控制结构第 6 章 数组、排序和查找第 7 章 面向对象编程(基础部分)第 8 章 面向对象编程(中级部分) 第 2 章 Java 概述 2.1 Java 重要特点 Java 语言是面向对象的(oop) Java 语言是健壮的。Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证 Java 语言是跨平台性的。[即: 一个编译好的.class 文件可以在多个系统下运行,这种特性称为跨平台] Jav

weixin_43973189的博客 4万+

Java基础笔记(韩顺平)已完结

Java零基础(韩顺平老师)基础笔记,复习可以从二维数组开始看起,若笔记有误请在评论区提出,感谢!

wthsoso的博客 7215

【免费下载】 Linux-韩顺平学习笔记 - PDF-PPT

Linux-韩顺平学习笔记 - PDF-PPT 【下载地址】Linux-韩顺平学习笔记-PDF-PPT Linux-韩顺平学习笔记 - PDF-PPT本仓库提供了一份详尽的Linux课程学习笔记,由韩顺平老师编写 项目地址: ht...

gitblog_06685的博客 1942

探索Java编程之旅 —— "韩顺平_循序渐进学Java零基础"全面解析

探索Java编程之旅 —— "韩顺平_循序渐进学Java零基础"全面解析 【下载地址】韩顺平_循序渐进学Java零基础完整笔记1分享 韩顺平_循序渐进学Java零基础【完整笔记】1欢迎来到“循序渐进学Java零基础”笔记资源库 ...

gitblog_06678的博客 958

B站韩顺平学Java课程——个人笔记(1章~19章)

根据B站韩顺平老师30天学会Java视频学习所记录的笔记(包含作业代码)。(1章~19章)

W666888DB的博客 6382

P148-P153 0147-0152_韩顺平Java_本章作业1-6

/定义一个求三次方的函数cube,Math.pow虽能求但是是double类型的 public static int cube(int number) {System . out . println("是否想判断一个整数是否为水仙花数?y/n");break;} System . out . println("请输入一个整数:");System . out . println("该数是水仙花数");} else {

weixin_44041958的博客 1906

韩顺平Java从入门到精通教学PPT:助力Java学习之路

韩顺平Java从入门到精通教学PPT:助力Java学习之路 【下载地址】韩顺平Java从入门到精通教学PPT 这套由知名Java讲师韩顺平精心制作的Java教学PPT,涵盖了从入门到精通的全面知识点,适合初学者和进阶者使用。内容详实、步骤清晰,帮助用户深入理解Java编程的基础与高级特性。无论你是刚接触Java,还是希望...

gitblog_06729的博客 1063

韩顺平教育java高级课程

如何实现“韩顺平教育java高级课程” 作为一名经验丰富的开发者,我很高兴能够帮助刚入行的小白实现“韩顺平教育java高级课程”。在这个过程中,我会详细介绍整个实现流程,并提供代码示例和注释,以确保你能够理解并掌握每个步骤。 实现流程 首先,让我们通过一个表格来了解实现“韩顺平教育java高级课程”的整个流程: 步骤...

weixin_41574285的博客 867

【韩顺平 零基础30天学会Java】前言

开始学习Java之前的工作准备

hjh_cos 1003
上一篇: 【Java】韩顺平Java学习笔记 第16章 坦克大战
下一篇: Datawhale AI夏令营 从零入门机器学习竞赛 Task 1
COTAS
博客等级 码龄7年 369粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值