java yied的用法,Java多线程的wait(),notify(),notifyAll()、sleep()和yield()方法使用详解,...

Java多线程的wait(),notify(),notifyAll()、sleep()和yield()方法使用详解,

Java多线程中的wait(),notify(),notifyAll()、sleep()和yield()方法

我们先从一个案例开始:

static public class WaitingTest {

//static创建静态对象,确保是同一个monitor对象

static Object obj = new Object();

public static void main(String[] args) {

//new Thread(Runnable target, String name)

//第一个线程,匿名内部类形式创建,name:"等待线程"

new Thread(new Runnable() {

@Override

public void run() {

while(true) {

synchronized (obj) {

System.out.println(Thread.currentThread().getName()+

"===>获取到锁对象,调用wait方法,进入waiting状态,释放锁对象");

try {

obj.wait(); //无限等待,如果想唤醒一个正在等待的线程,那么需要开启一个线程通过notify()或者notifyAll()方法去通知正在等待的线程获取monitor对象。notify()唤醒一个wait对象,或者notifyAll唤醒所有wait对象。

} catch (InterruptedException e) {

e.printStackTrace();

}

//若没有notify()唤醒,则下面这句话永远不执行

System.out.println(Thread.currentThread().getName()+

"=====>从waiting状态醒来,获得了锁对象,可以继续执行了...");

}

}

}

},"等待线程").start();

//第二个线程,同样也是匿名内部类形式创建,name:"唤醒线程"

new Thread(new Runnable() {

@Override

public void run() {

while(true) {

System.out.println(Thread.currentThread().getName()+"=====>休眠三秒钟");

try {

Thread.sleep(3000L);//虽然当前线程进入了睡眠状态,但是依然持有monitor对象。在中断完成之后,自动进入唤醒状态从而继续执行代码

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (obj) {

System.out.println(Thread.currentThread().getName()+

"=====>获得了锁对象,调用notify方法,释放锁对象");

obj.notify();

}

}

}

},"唤醒线程").start();

}

}

执行结果:

​ 等待线程===>获取到锁对象,调用wait方法,进入waiting状态,释放锁对象

​ 唤醒线程=====>休眠三秒钟

​ 唤醒线程=====>获得了锁对象,调用notify方法,释放锁对象

​ 唤醒线程=====>休眠三秒钟

​ 等待线程=====>从waiting状态醒来,获得了锁对象,可以继续执行了...

​ 等待线程===>获取到锁对象,调用wait方法,进入waiting状态,释放锁对象

​ 唤醒线程=====>获得了锁对象,调用notify方法,释放锁对象

​ 唤醒线程=====>休眠三秒钟

​ 等待线程=====>从waiting状态醒来,获得了锁对象,可以继续执行了...

​ 等待线程===>获取到锁对象,调用wait方法,进入waiting状态,释放锁对象

5b723bf3962071726519eb602c2f91b7.png

wait()方法:

(1)调用了wait()之后当前线程会处于等待状态(无限等待状态)。

(2)每个线程必须持有该对象的monitor(Object's monitor)。如果在当前线程中调用wait()方法之后,该线程就会释放monitor的持有对象并让自己处于等待状态。

(3)如果想唤醒一个正在等待的线程,那么需要开启一个线程通过notify()或者notifyAll()方法去通知正在等待的线程获取monitor对象。当然,需要注意的一点就是,必须是同一个monitor对象。如此,该线程即可打破等待的状态继续执行代码。

notify()方法:

(1)当一个线程处于wait()状态时,也即等待它之前所持有的object's monitor被释放,通过notify()方法可以让该线程重新处于活动状态,从而去抢夺object's monitor,唤醒该线程。

(2)如果多个线程同时处于等待状态,那么调用notify()方法只能随机唤醒一个线程。

(3)在同一时间内,只有一个线程能够获得object's monitor,执行完毕之后,则再将其释放供其它线程抢占。

notifyAll()方法:

(1)notifyAll()只会唤醒那些等待抢占指定object's monitor的线程,其他线程则不会被唤醒。

(2)notifyAll()只会一个一个的唤醒,而并非统一唤醒。因为在同一时间内,只有一个线程能够持有object's monitor

(3)notifyAll()只是随机的唤醒线程,并非有序唤醒。

总结:

​ wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能。因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。

1fd4a45b8853d06512aa32a65377ab2e.png

sleep()方法:sleep(long millis) sleep(long millis, int nanos)

(1)调用sleep()之后,会引起当前执行的线程进入暂时中断状态,睡眠状态,即阻塞状态。

(2)虽然当前线程进入了阻塞状态,但是依然持有monitor对象。

(3)在中断完成之后,自动进入就绪状态。sleep()方法虽然会使线程中断,但是不会将自己的monitor对象释放,在中断结束后,依然能够保持代码继续执行。

yield()方法:线程让步

(1)使线程从运行状态到就绪状态,所以yield()方法很有可能刚执行完又继续获取到CPU资源继续执行。

(2)调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程,即让系统线程调度器重新调度。

(3)它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间(没有形参)。

(4)yield()只会让同优先级或更高优先级得到执行机会,而sleep()是无限制的。

最后附一张我自己的手绘多线程生命周期图(字有点丑,请见谅)

2b6daeb9af2754ab0ae8fa2a920dc15c.png

如有错误,欢迎指点

相关文章暂无相关文章

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

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

相关文章

海马体启发的记忆模型

来源:混沌巡洋舰 记忆是人类智能的关键,我们因为记忆可以把过去和当下整合成为一体, 并且可以预测未来。记忆不仅是一个信息承载的工具, 更是世界模型的本体, 它无时无刻不在刻画未来, 也被当下影响&#…

DeepMind最新发现!神经网络的性能竟然优于神经符号模型

来源:深度学习这小事按照之前的常识,结合了算法和符号推理技术的神经符号模型(Neurosymbolic Models),会比神经网络更适合于预测和解释任务,此外,神经符号模型在反事实方面表现更好。而Neural-S…

刚刚Sci-Hub和特朗普一样被永久封禁,Twitter官方:不得上诉

来源:量子位晓查 发自 凹非寺 公众号:QbitAI今天,Twitter官方宣布永久封禁特朗普的账号。而另一个账号的封禁恐怕更让科学界感到震惊。有用户发现,Sci-Hub的Twitter账号和特朗普一样,都被完全清空了。随后,…

javaweb简要介绍,虚拟路径,虚拟主机

1. 静态,动态:是否随时间,地点,用户操作的改变而改变 动态网页 需要使用到 服务端脚本语言(JSP) 2. 架构: CS: Client Server eg:qq,微信,cs游戏 不足: 1.如果软…

物理学中的不确定性

来源:人机与认知实验室吴骏(香港中文大学通识教育基础课程讲师)【物理研究的只是模型,而不是真理】物理学中的确定性问题缘起于我正在教授的《与自然对话》[1] 这门课。其中节选了詹姆士华生 (James Watson) 在2003年写的一本畅销…

JSP执行流程

第一次访问:服务端将jsp翻译成java,再将Java编译成class文件 第二次访问:直接访问class文件较快,所以第一次访问比较慢,以后就快了 (如果服务器代码修改了,则需要重新进行翻译,编译…

玩电子游戏的神经网络,告诉我们大脑是如何决策的

来源:混沌巡洋舰当你开车的时候,你的大脑会接收大量的视觉信息,并用它来做出驾驶的决定,比如什么时候刹车或者换车道。大脑需要决定在你的视野中哪些信息是做出这些决定所必需的。例如,另一辆车的位置是非常重要的&…

2021年的第一盆冷水:有人说别太把图神经网络当回事儿

来源:数学中国图神经网络(GNN)是机器学习中最热门的领域之一,在过去短短数月内就有多篇优秀的综述论文。但数据科学家 Matt Ranger 对 GNN 却并不感冒。他认为这方面的研究会取得进展,但其他研究方向或许更重要。博客链…

JSP页面元素,内置对象及request详解

JSP的页面元素&#xff1a; a. 脚本Scriptlet 1.<% 局部变量&#xff0c;Java语句 %> 2.<%! 全局变量&#xff0c;定义方法 %> 3.<% 输出表达式 %> 一般而言&#xff0c;修改web.xml&#xff0c;配置文件&#xff0c;Java&#xff0c;需要重启tomcat服务&am…

美国科学院报告《无止境的前沿:科学的未来75年》

来源&#xff1a;科技咨询频道作者&#xff1a;刘昊 张志强 曹玲静编译&#xff1a;刘昊 张志强 曹玲静 &#xff08;中国科学院成都文献情报中心&#xff09;2020年12月17日&#xff0c;美国国家科学院出版报告《无止境的前沿——科学的未来75年》&#xff08;The Endless Fro…

jsp内置对象--response

response&#xff1a;响应对象 提供的方法&#xff1a;void addcookie(Cookie cookie);服务端向客户端增加一个cookie对象 void sendRedirect(String location) throws IOException:页面跳转的一种方式&#xff08;重定向&#xff09; void setContetType(String type) :设置…

AR增强现实技术解读

来源&#xff1a;网络 AR增强现实&#xff0c;是用户对现实世界感知的新技术。一般认为&#xff0c;AR技术的出现源于虚拟现实技术&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;的发展&#xff0c;但二者存在明显的差别。传统VR技术给予用户一种在虚拟世界中完全…

人工智能十年回顾:CNN、AlphaGo、GAN……它们曾这样改变世界

来源&#xff1a;机器学习研究组订阅号过去十年间&#xff0c;人工智能技术突飞猛进&#xff0c;最疯狂的科幻小说场景现在已经成为我们生活中不可或缺的一部分。十年前&#xff0c;人们在谈论 AI 的理论化和实验&#xff0c;但这些年来&#xff0c;AI 变得更加切实了&#xff…

jsp--cookie

cookie&#xff08;客户端&#xff0c;不是内置对象&#xff09;:Cookies是服务端生成的&#xff0c;再发送给客户端保存 相当于本地缓存的作用&#xff1a; 客户端->服务端 eg&#xff1a;看一个电影&#xff0c;服务端产生发给客户端&#xff0c;第二次看就快了 作用&a…

Python学习笔记——GIF倒放处理

自动读取指定路径下所有gif格式的文件&#xff0c;利用Python图像处理库PIL下的Image、ImageSequence模块&#xff0c;批量实现gif倒放处理并保存。代码如下&#xff1a;# encoding: utf-8 import os import sys from PIL import Image, ImageSequencepath sys.path[0] …

OpenAI发布新人工智能系统:根据文字生成图像

来源&#xff1a;新浪科技据报道&#xff0c;旧金山人工智能研究公司OpenAI已经开发了一种新系统&#xff0c;能根据短文本来生成图像。OpenAI在官方博客中表示&#xff0c;这个新系统名为DALL-E&#xff0c;名称来源于艺术家萨尔瓦多达利&#xff08;Salvador Dali&#xff09…

jsp内置对象--session

session&#xff08;服务端&#xff09; session&#xff1a;会话 1. 浏览网站&#xff1a;开始->关闭 2. 购物&#xff1a;浏览&#xff0c;结算&#xff0c;付款&#xff0c;退出 3. 电子邮件&#xff1a; 浏览&#xff0c;写邮件&#xff0c;退出 以上都是session的…

python深拷贝实现原理,js递归实现深拷贝

经过小编之前关于JavaScript深拷贝实现方式的介绍&#xff0c;大家已经知道深拷贝能够实现真正意义上的数组和对象的拷贝。其实使用内置对象JSON虽然简答&#xff0c;但不能将对对象的方法深拷贝&#xff0c;因此使用递归的方式就是最实用的&#xff0c;本文介绍使用递归的方式…

梅宏院士:操作系统变迁有20年周期律,泛在计算是一片新蓝海

梅宏来源&#xff1a;观察者网作者&#xff1a;梅宏院士中国科学院院士、发展中国家科学院院士、欧洲科学院外籍院士、IEEE FELLOW&#xff0c;中国计算机学会理事长&#xff0c;北京大学信息技术高等研究院智能软件技术与应用研究中心首席科学家。信息技术发展正在进入人机物融…

IEEE CS:2021年的12大技术趋势

来源&#xff1a;笑看国际风云LOS ALAMITOS, Calif., 16 December 2020 – IEEE计算机协会&#xff08;IEEE CS&#xff09;公布了其2021技术预测报告&#xff08;2021 Technology Predictions&#xff09;&#xff0c;重点关注大流行对人类生活&#xff0c;供应链&#xff0c;…