wait放弃对象锁_Java线程中wait、await、sleep、yield、join用法总结

一、wait()、notify()、notifyAll()用法

  • obj.wait()/obj.wait(long timeout)是Object中的方法,当线程调用wait()方法,当前线程释放对象锁,进入等待队列。
  • obj.notify()/obj.nogifyAll()是Object中的方法,唤醒在此对象上wait()的单个或者所有线程。

测试代码:

public class ThreadWaitNotify {public static void main(String[] args) throws InterruptedException {//创建一个线程池ExecutorService executorService = Executors.newCachedThreadPool();//创建DemoTest对象DemoTest demoTest = new DemoTest();//用线程池创建线程异步执行waitTest方法executorService.submit(() -> demoTest.waitTest());//用线程池创建线程异步执行notifyTest方法executorService.submit(() -> demoTest.notifyTest());}//测试wait和notify测试demostatic class DemoTest {//唤醒线程public synchronized void notifyTest() {System.out.println("方法notifyTest开始执行了");notify();System.out.println("方法notifyTest执行结束了");}//执行wait操作将线程挂起,注意必须结合synchronized使用public synchronized void waitTest() {System.out.println("方法waitTest开始执行了");try {wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("方法waitTest执行结束了");}}
}

打印日志:

方法waitTest开始执行了
方法notifyTest开始执行了
方法notifyTest执行结束了
方法waitTest执行结束了

从日志中我们可以看出waitTest方法阻塞直到被notifyTest唤醒

二、await()、signal()、signalAll()用法

java.util.concurrent类库中提供的Condition类来实现线程之间的协调。

  • condition.await()/condition.await(long time, TimeUnit unit):通过condition调用,当前线程释放对象锁。
  • condition.signal()/condition.signalAll():通过signal或者signalAll方法唤醒await挂起的线程。

测试代码:

public class ThreadAwaitSignal {public static void main(String[] args) {//创建一个线程池ExecutorService executorService = Executors.newCachedThreadPool();//创建DemoTest对象DemoTest demoTest = new DemoTest();//用线程池创建线程异步执行awaitTest方法executorService.submit(() -> demoTest.awaitTest());//用线程池创建线程异步执行signalTest方法executorService.submit(() -> demoTest.signalTest());}/*** 使用java.util.conncurrent类中提供了Condition类来实现线程之间的协调* 可以在Condition上调用await()方法使线程挂起* 其他线程调用signal()或者signalAll()来唤醒线程*/static class DemoTest {//定义一个Lock对象用来获取Condition对象private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();//唤醒线程public void signalTest() {lock.lock();try {System.out.println("方法signalTest开始执行了");condition.signalAll();System.out.println("方法signalTest执行结束了");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}//结合lock锁实现Condition的awaitpublic void awaitTest() {lock.lock();try {System.out.println("方法awaitTest开始执行了");condition.await();System.out.println("方法awaitTest执行结束了");} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}
}

打印日志:

方法awaitTest开始执行了
方法signalTest开始执行了
方法signalTest执行结束了
方法awaitTest执行结束了

从日志中国可以看出我们得到了和wait同样的效果。

三 、yield()、join()用法

  • Thread.yield():一定是当前线程调用此方法,当前线程放弃获取CPU的时间片,由运行态转变为就绪态,让操作系统中再次选择线程执行。作用:让相同优先级的线程轮流执行,但并不能保证轮流执行,根据解释我们了解到,转成就绪态的的线程还有可能再次选中执行。Thread.yield()方法不会导致阻塞。
  • t.join()/t.join(long millis):当前线程调用t2.join()方法,当前线程阻塞但是不会释放对象锁,直到t2线程执行完毕或者millis时间到,则当前的线程恢复就绪状态。作用:让优先级比较高的线程优先执行。

yield测试代码:

    //yield放弃CPU时间片public static void yieldTest(){//定义一个线程Thread thread = new Thread(() -> {System.out.println(Thread.currentThread().getName() + ": 测试线程开始执行。。。");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ": 测试线程执行结束了。");});thread.start();System.out.println(Thread.currentThread().getName() + ": 执行yield方法");Thread.yield();System.out.println(Thread.currentThread().getName() + ": 主线程开始执行");}

打印结果:

main: 执行yield方法
main: 主线程开始执行
Thread-0: 测试线程开始执行。。。
Thread-0: 测试线程执行结束了。

可以看出虽然主线程调用了yield,但是仍然又开始执行了,因此但并不能保证轮流执行。

join测试代码:

   //join抢占CPU时间片public static void joinTest() throws InterruptedException {//定义一个线程Thread thread = new Thread(() -> {System.out.println(Thread.currentThread().getName() + ": 测试线程开始执行。。。");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ": 测试线程执行结束了。");});thread.start();System.out.println(thread.getName() + ": 执行join方法");thread.join();System.out.println(Thread.currentThread().getName() + ": 主线程开始执行");}

打印日志:

Thread-0: 执行join方法
Thread-0: 测试线程开始执行。。。
Thread-0: 测试线程执行结束了。
main: 主线程开始执行

从日志中我们可以看出主线程在线程执行完成后才开始执行。

四、wait()、await()、sleep()、yield、join对比

通过表格对比(join的情况下,t1指代当前线程,t2代表其他线程)

aa69709410f0ad087e6d4937fac63b53.png

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

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

相关文章

10个C#编程和Visual Studio使用技巧

摘要:C#是一门伟大的编程语言,与C++和Java相比,它的语法更简单,相对来说更好入门。Visual Studio作为.Net平台上最重量级的IDE,也通过不断的更新为开发者带来更出色的开发体验。本文将介绍10个C#编程和Visual Studio IDE使用技巧。

AspNet Core 6.0 Json写默认首字母小写(camelCase)问题

最近在把旧项目迁移到.net core6.0时遇到了之前一样的问题:框架返回的json序列化时将原来的首字母大写的字段统统转成了首字母小写的小驼峰命名,导致原来写好的前端数据无法正确渲染。于是上网找了下取消该默认行为的方法,在Startup.cs中添加…

学习总结——Selenium元素定位

读一本好书&#xff0c;不能读读就算了&#xff0c;做一下总结&#xff0c;变成自己的&#xff0c;以备查阅。 1. driver.findElement(By.id(<element ID>)) ID是独一无二的&#xff0c;使用ID定位是最为推荐的方法。 但是&#xff1a;1.不是所有元素都会指定ID&…

open ssl里面的自定义get***函数失效

1 问题 在open ssl加载引起里面部分我自己写了一个get和set方法,然后我在其它地方调用使用了Info类型的声明 extern Info info; 先初始化info,然后 info->setA(&info, value); char value[100]; 但是我立马 info->getA(&info, value, sizeof(value)); LOGI(…

计算机在现代商业中的作用,现代商业中计算机web数据挖掘技术的应用

[摘 要] 随着科技水平的不断提高&#xff0c;各种高科技设备辅助互联网将数字化、信息化的方法和手段运用到了各行各业之中&#xff0c;尤其在现代商业中&#xff0c;国际化、全球化的市场规模使得信息的处理工作极为庞大&#xff0c;需要更多的依赖计算机技术来完成。Web数据挖…

八种状态增加测试用例状态的精确度

一般在工作中记录测试用例状态用到三种状态&#xff1a;通过&#xff08;Pass&#xff09;&#xff0c;失败&#xff08;Fail&#xff09;和排队等待中&#xff08;In Queue&#xff09;。但是我倾向与更准确地表示一个一般测试用例的生命周期&#xff0c;尽管你的测试的周期会…

怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...

今天学习了类、对象及相关知识&#xff0c;试着从内存角度分析三者关系&#xff0c;如果有不对的地方请指正首先得先介绍java中的三个内存区域&#xff1a;栈区用于存放该线程执行方法的信息&#xff08;实际参数、局部变量等&#xff09;。栈属于线程私有&#xff0c;不能实现…

pycharm提示your evalluation license has expired解决方法

安装pycharm&#xff0c;一段时间后提示your evalluation license has expired&#xff1a;打开pycharm--点击help--register--选中license server,输入license server address如图示即可 转载于:https://www.cnblogs.com/youtiaoge/p/7125070.html

【SPSS统计分析】SPSS聚类分析:一个案例演示聚类分析全过程(附SPSS 19.0中文版下载)

摘要:案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称、热量、钠含量、酒精含量、价格。数据来自《SPSS for Windows 统计分析》。 目 录 问题一:选择那些变量进行聚类?——采用“R型聚类

python利用特征进行可视化样本显示_利用Python进行机器学习之特征选择

毫无疑问&#xff0c;解决一个问题最重要的是恰当选取特征、甚至创造特征的能力&#xff0c;这叫做特征选取和特征工程。对于特征选取工作&#xff0c;我个人认为分为两个方面&#xff1a;1)利用python中已有的算法进行特征选取。2)人为分析各个变量特征与目标值之间的关系&…

poj 2886 Who Gets the Most Candies?(线段树)

题目链接&#xff1a;poj 2886 Who Gets the Most Candies?题目大意&#xff1a;N个人围成一圈玩约瑟夫环游戏&#xff0c;不同的是。步长不固定&#xff0c;由前一个出局的人决定。给定K表示起始的人。第i个淘汰的人将获得g(i)个糖果&#xff0c;问说谁获得的糖果最多。g(x)为…

linux c之动态打开链接库(dlopen dlsym dlclose)

1 linux提供了加载和处理动态链接库的系统调用 2 主要函数 1) dlopen、 dlopen以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程,打开模式如下: RTLD_LAZY 暂缓决定,等有需要时再解出符号 RTLD_NOW 立即决定,返回前解除所有未决定的符号。 2) dlsym、 …

甘肃2019年9月计算机二级报名入口,2019年9月甘肃计算机二级考试成绩查询入口...

【摘要】2019年9月份计算机二级考试已经圆满结束&#xff0c;参加考试的小伙伴们已经迫不及待的想要知道成绩了吧&#xff0c;小编对2019年9月甘肃计算机二级考试成绩查询入口进行了整理&#xff0c;参加9月份考试的朋友们到时候记得按时查询成绩哦&#xff01;想要了解更多计算…

FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库

简介FluentEmail - 适用于 .NET 和 .NET Core 的邮件发送库从 .NET 和 .NET Core 发送电子邮件的最简单方法。将 Razor 用于电子邮件模板并使用 SendGrid、MailGun、SMTP 等进行发送Nuget包•FluentEmail.Core - 域模型•FluentEmail.Smtp - 通过 SMTP 服务器发送电子邮件•Flu…

基于GLT法的风云三号气象卫星校正

GLT几何校正法利用输入的几何文件生成一个地理位置查找表文件(geographic lookup table,GLT),从该文件中可以了解到某个初始像元在最终输出结果中实际的地理位置。地理位置查找表文件是一个二维图像文件,文件中所包含两个波段:地理校正图像的行和列,文件对应的灰度值表示…

安装MySql出现Error Nr.1045的解决办法

如图&#xff0c;最后一步出现这个错误框 这是因为上次安装过MySql&#xff0c;其用户数据在卸载的时候没有被删除掉&#xff0c;解决办法如下&#xff1a; 显示隐藏的文件夹&#xff0c;打开C盘&#xff0c;找到下图文件删除之 删除之后再安装一遍MySQL&#xff0c;就可以了转…

CentOS下MySQL忘记root密码解决方法【转载】

1&#xff0e;首先确认服务器出于安全的状态&#xff0c;也就是没有人能够任意地连接MySQL数据库。 因为在重新设置MySQL的root密码的期间&#xff0c;MySQL数据库完全出于没有密码保护的 状态下&#xff0c;其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对 外…

MYSQL - php 使用 localhost 无法连接数据库

php 使用 localhost 无法连接数据库&#xff0c;而使用127.0.0.1却能连接成功。 可能原因&#xff1a; 系统hosts文件未提供127.0.0.1到localhost的解析。解决方法&#xff08;以win7系统为例&#xff09;&#xff1a;找到C:&#xff3c;Windows&#xff3c;System32&#xff3…

python网易云_用python爬虫爬取网易云音乐

标签&#xff1a; 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去。按键盘F12打开网页调试工具,点击Network就可以查看网络请求的相关信息&#xff0c;选择XHR&#xff0c;然后可以看…

android 固定底部 布局_Android系统列表控件

在android系统控件中&#xff0c;有多个控件可以展示列表数据。一、ListView该组件是android中最常用的一个UI组件&#xff0c;用于实现在屏幕上显示多个内容&#xff0c;以便于我们用手指进行滑动。ListView控件以列表的形式展示具体内容&#xff0c;并且能够根据数据的长度自…