当前位置:首页 > Java技术 > Java多线程中sleep()、wait()、yield()、notify()、notifyAll()理论知识

Java多线程中sleep()、wait()、yield()、notify()、notifyAll()理论知识

2022年11月10日 11:06:24Java技术8

🔗参考链接:
https://www.cnblogs.com/aspirant/p/8876670.html
https://www.pianshen.com/article/42791090981/

必须明白的前置知识点:

线程所具有的资源主要有两个部分: 【CPU资源】和【锁资源

  • CPU资源: CPU资源被划分成时间片,一旦一个线程获得时间片就有权力执行自己的代码块
  • 锁资源: 一但一个线程掌握一个对象的锁其他线程无法对该对象进行存取

sleep(): 让出CPU资源但保存锁资源
wait(): 让出CPU资源和锁资源

下面这张图非常重要,一旦能够默写出来在思维上能够与后续Java多线程的学习起到前呼后应的效果
Java多线程中sleep()、wait()、yield()、notify()、notifyAll()理论知识 _ JavaClub全栈架构师技术笔记

线程状态

状态名称 状态描述
新建状态(new) 当线程对象创建后即进入了新建状态,eg: Thread t = new MyThread();
就绪状态(runnable) 当调用线程对象的start()方法(t.start()),线程就进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好运行的准备,一旦获得CPU的时间片就进入运行状态。
运行状态(running) 可运行状态(runnable)的线程获得CPU时间片后就立即进入运行状态(就绪状态是运行状态的唯一接口)。
阻塞状态(blocked) 处于运行状态的线程由于某种原因而暂时放弃CPU使用权后的状态.(阻塞状态分为三种:等待阻塞、同步阻塞、其他阻塞)
死亡状态(dead) 线程执行任务完毕或在运行过程中出现不可修复的错误

阻塞状态的三种类型

  1. 等待阻塞】:运行状态中的线程执行wait()方法,释放CPU资源保留锁资源从而进入等待阻塞状态。JVM会将等待阻塞状态的线程放入等待队列(waiting sequence)中。
  2. 同步阻塞】:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,获取synchronized同步锁失败,它会进入同步阻塞状态,则JVM会把该线程放入锁池(lock pool)中
  3. 其他阻塞】:通过调用sleep()或join()或发出I/O请求超时会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
1. sleep() - 让正在运行的线程进入其他阻塞状态
sleep会让线程释放CPU资源但保存锁资源,提供其他线程运行的机会且不用考虑优先级, 可以通过调用interrupt()方法来唤醒休眠的线程。
2. yield() - 让正在运行的线程再次回到就绪状态(有限等待)
yield()方法释放出CPU资源只提供给同优先级的线程 (yield()方法只有一个目的: 就是告诉线程调度器自身的工作已经完成差不多了,可以让别的具有相同级别的线程过了抢占CPU资源完成工作)
3. wait(): - 让正在运行的线程进入等待阻塞状态
处于等待阻塞状态的线程会通过JVM调用进入等待序列中待notify\notifyAll()来唤醒调入锁标志池中
4. join(): - 让正在运行的线程进入其他阻塞状态(让权等待)
在实际操作中一个线程调用另一个线程的join()方法让出CPU资源进入其他阻塞状态等到让给的线程完成工作之后进入就绪状态

wait()、notify()、notifyAll的工作机制

wait()、notify()、notifyAll()都是Object类中的方法 - 他们是用来协调多个线程对共享数据的存取,所以必须出现在synchronized快中

synchrnoized关键字是用来保护共享数据,防止其他线程对共享数据的存取。但是为了保证共享资源具有一定的并发能力
让其他线程有一定机会进行操作则需要调用wait()、notify()、notifyAll()这三个方法进行灵活控制。

(1)一个运行态的线程调用wait()方法进入等待阻塞状态让出CPU和锁资源进入等待序列中,此时其他线程可以进入synchronized块中

(2)当调用notify()方法,将从等待序列中调用任意一个线程进入锁标志池中,只有锁标志池中的线程才能获得对象的锁标志。

(3)当调用notifyAll()方法,将从等待序列中调用所有的线程进入锁标志池中。

3. Java中wait()、sleep()的区别?

1. 【所属的类不同】wait()属于Object类的方法,sleep()属于Thread类的方法。
2. 【CPU资源和锁资源释放不同】wait()方法释放CPU和锁资源,sleep()方法仅释放CPU资源但保存锁资源。
3. 【各类的工作机制不同】
一个运行态线程调用wait()方法进入等待阻塞状态被放入等待序列等待notify/notifyAll唤醒进入锁标志池中(用于锁机制)。
一个运行态线程调用sleep()方法进入其他阻塞状态一个sleep()结束或通过interrupt()唤醒进入就绪状态。

作者:Felix_Openmind
来源链接:https://www.cnblogs.com/openmind-ink/p/14939685.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/69267.html

分享给朋友:

“Java多线程中sleep()、wait()、yield()、notify()、notifyAll()理论知识” 的相关文章

Java打印车票主要学习Java的比较语句

直接上代码 public static void main(String[] args) { // TODO Auto-generated method stub //初始化 Scanner in=new Scanner(S...

我对java String的理解 及 源码浅析

我对java String的理解 及 源码浅析

摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 每天起床告诉自己,自己的目标是 ”技术 + 英语 还有生活“! -泥沙砖瓦浆木匠 一...

编写高质量代码改善java程序的151个建议——[52

编写高质量代码改善java程序的151个建议——[52

原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks Although the world is full of...

java中的内部类总结

java中的内部类总结,包括静态内部类、私有内部类、方法内部类等 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)...

java高级

java高级

  Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。下...

JAVA的文件操作【转】

11.3 I/O类使用          由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择。因为文件是一种常见的数据源,而且读写文件也是程...

Java 干货之深入理解Java泛型

Java 干货之深入理解Java泛型

一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类。如果要编写可以应用多中类型的代码,这种刻板的限制对代码得束缚会就会很大。 ---《Thinking in Java》 泛型大家都接触的不少,但是由于Java 历史的原因,Java 中的泛型一直...

Java NIO之Selector(选择器)

Java NIO之Selector(选择器)

历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集群原理及搭建与使用 超详细的Java...

Java笔记:Java集合概述和Set集合

本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组就有点无能为力了;而且数组无法保存具有映射关系的数据。为了保存数量不确定的...

2.Java中Exception和Error的区别

2.Java中Exception和Error的区别

Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型 Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。