java 多线程 await condition,Java多线程(3):使用Condition中的await、signal进行线程间协作..._weixin_39570505的博客-程序员秘密

技术标签: java 多线程 await condition  

详情见《Java语言程序设计-进阶篇》P238

使用场景:

使用condition可以实现线程协作。取款线程发现账户余额不足,先停止自己的线程,等待存款线程存入钱后再叫醒该取款线程重新取钱。

编码流程:

从ReentrantLock对象获得Condition对象

Lock lock=new ReentrantLock();

Condition condition=lock.newCondition();

一个取款线程A发现账户余额不足,

while(balance

{

System.out.println("await()");

condition.await();

}

System.out.println("回来了threadA()");

···

···

finally{

lock.unlock();

}

线程A会在第四行停下来,进入休眠状态,不会去执行后面的finally内容!!

而这时一个存款线程B可以获取到这个锁然后进行存款操作,存款操作结束后,再调用signalAll():

condition.signalAll();

System.out.println("先执行完所有threadB内容");

···

···

finally{

lock.unlock();

}

调用signalAll()之后,线程B会将下面的全部代码执行完之后进入finally自己手动解锁,然后线程A才能拿到锁,并且在原来停下来的第四行继续往后执行,直至线程任务结束进入finally,解除lock。

一个需要注意的问题 :

--

普通一个线程(包括使用线程池!)中的任务执行完毕之后会自动结束!

Thread thread=new Thread(new Runnable()·····

···

···

···);

thread.start();

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39570505/article/details/115782660

智能推荐

JDK1.8-Stream中常用的API(流操作)_weixin_33922670的博客-程序员秘密

1 StreamStream是一组用来处理数组,集合的API。1.1 特性不是数据结构,没有内部存储。不支持索引访问。延迟计算支持并行很容易生成数据或集合支持过滤,查找,转换,汇总,聚合等操作。1.2 运行机制Stream分为源source,中间操作,终止操作。流的源可以是一个数组,集合,生成器方法,I/O通道等等。一个流可以有零个或多个中间操作,每一个中间操作都会返回...

社区版hadoop和第三方发行版比较_A叶子叶的博客-程序员秘密

基于Apache的组件部署较繁琐且容易出错,组件耦合性太大,因此考虑到Hadoop集群部署的高效,集群的稳定性,以及后期集中的配置管理,业界多使用Cloudera公司的发行版(CDH),综述两者的区别及第三方发行版本如下。Apache社区版优点:完全开源免费,社区活跃,且文档、资料详实;缺点:1、复杂的版本管理。版本管理比较混乱的,各种版本层出不穷;2、复杂的集群部署、安装、配置。通常按照集群需要编写大量的配置文件,分发到每一台节点上,容易出错,效率低下。3、复杂的集群运维。对集群的监控

CentOS打开关闭永久防火墙指定端口_JoePotter的博客-程序员秘密

例如MySQL的端口3306firewall-cmd --zone=public --add-port=3306/tcp --permanent重启防火墙并查看是否生效firewall-cmd --reload #重启firewallfirewall-cmd --list-ports #查看已经开放的端口删除一个端口firewall-cmd --remove-port...

LightOJ 1220 Mysterious Bacteria(唯一分解定理)_weixin_34413802的博客-程序员秘密

Dr. Mob has just discovered a Deathly Bacteria. He named it RC-01. RC-01 has a very strange reproduction system. RC-01 lives exactly x days. Now RC-01 produces exactly p new deadly Bacteria where x = ...

qt 插件式开发框架_苏林同学的博客-程序员秘密_qt 插件框架

1,新建工程,主程序。//PluginTest.h#include <QDir>#include <QApplication>#include <QMenuBar>class PluginTest : public QMainWindow{ Q_OBJECTpublic: PluginTest(QWidget *parent = Q_NU...

随便推点

mac本地部署 局域网访问_mac搭建本地服务器_weixin_39616339的博客-程序员秘密

目录基础部分1234启动服务器添加自定义文档到本地服务器查看自定义效果手机/其他电脑 访问本机服务器说明:本地开发需要搭建本地服务器进行页面的调试,mac系统自带apache服务,本篇日志是针对于mac系统搭建自己的本地服务器教程。1- 启动服务器 123sudo apachectl start 启动sudo apachectl restar 重新启动sudo apachectl stop 停止打...

note_33:悬浮窗_Champagne&Caviar的博客-程序员秘密

悬浮窗参考:Github:24Kshign/SuspensionWindowAndroid WindowManagerAndroid 悬浮窗权限各机型各系统适配大全文章目录悬浮窗1. 权限2. 创建悬浮窗(1) 布局及界面初始化(2) 参数初始化(4) 销毁悬浮窗3. Service1. 权限悬浮窗需要用户授权才能开启,如果在没有权限的情况下开启悬浮窗的话,会报window...

jQuery:ajax调用成功后返回数据_p15097962069的博客-程序员秘密_ajax成功返回

This question already has answers here : 这个问题已经在这里有了答案 :

在Ubuntu内对opencv的使用_ZBMZ30MZ的博客-程序员秘密

一、在Ubuntu安装opencv-3.4.1官网地址: 官网下载.下载完成后打开下载的文件夹,记住该路径2、将下载文件复制到home目录下,进行解压配置(1)拷贝我是在Ubuntu内打开QQ邮箱通过邮件将opencv-3.4.1下载(2)解压unzip opencv-3.4.1.zip(3)进入解压后的文件包中cd opencv-3.4.1(4)安装依赖库cmakesudo apt install cmake(5)安装完cmake之后执行命令 ,创建编译文件夹并进入文件夹

Web开发杂谈(1) —— 学习开发的三个层次_jackscript的博客-程序员秘密

 Web开发杂谈(1) —— 学习开发的三个层次由于我们现在的内容已经不仅仅在Web设计这个领域上了,所以新开一个新的系列——“Web开发杂谈”,讨论开发相关的话题。有不少读者和网友经常地留言,问类似这样问题:“我没有相关基础,我应该学习什么课程?”,或者“我没有相关基础,我能学会某某技术吗?”,“我不是计算机专业的,我能学会编程吗?”。作为这个系列的第一篇文章,就来谈谈我个人

JavaScript控制光标定位操作_fjfjfjgh的博客-程序员秘密_js控制光标位置

1、打开网页后将光标定位到某个Text文本框中var alem= document.getElementById('txt_HeadLine');alem.focus();2、打开网页后Text文本框内已经有了从数据库里读出来的内容,需要将光标定位到这个Text某个字符后面比如文本框内容是:您好:JavaScript是一种前端语言要将光标定位到冒号后面(不分中文或英文输入法),如...

推荐文章

热门文章

相关标签