线程间通信的几种方法_并发编程中的线程间通信
线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。
线程通信常用的方式有:
- wait/notify 等待
- Volatile 内存共享
- CountDownLatch 并发工具
- 使用 ReentrantLock 结合 Condition
- 基本LockSupport实现线程间的阻塞和唤醒
方式一:使用 volatile 关键字
基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式
运行结果为:
方式二:使用Object类的wait() 和 notify() 方法
众所周知,Object类提供了线程间通信的方法:wait()、notify()、notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。
注意: wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁
运行结果为
由打印结果截图可知,在线程A发出notify()唤醒通知之后,依然是走完了自己线程的业务之后,线程B才开始执行,这也正好说明了,notify()方法不释放锁,而wait()方法释放锁。
方式三:使用JUC工具类 CountDownLatch
jdk1.5之后在java.util.concurrent包下提供了很多并发编程相关的工具类,简化了我们的并发编程代码的书写,***CountDownLatch***基于AQS框架,相当于也是维护了一个线程间共享变量state
运行结果为:
方式四:使用 ReentrantLock 结合 Condition
运行结果为:
显然这种方式使用起来并不是很好,代码编写复杂,而且线程B在被A唤醒之后由于没有获取锁还是不能立即执行,也就是说,A在唤醒操作之后,并不释放锁。这种方法跟 Object 的 wait() 和 notify() 一样。
方式五:基本LockSupport实现线程间的阻塞和唤醒
LockSupport 是一种非常灵活的实现线程间阻塞和唤醒的工具,使用它不用关注是等待线程先进行还是唤醒线程先运行,但是得知道线程的名字。
运行结果
线程间通信的几种方法_并发编程中的线程间通信相关推荐
- cas无法使用_并发编程中cas的这三大问题你知道吗?
在java中cas真的无处不在,它的全名是compare and swap,即比较和交换.它不只是一种技术更是一种思想,让我们在并发编程中保证数据原子性,除了用锁之外还多了一种选择. 一.cas的思想 ...
- java实现分而治之_并发编程中一种经典的分而治之的思想!!
写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...
- python中遇到的问题及解决方法_自己编程中遇到的Python错误和解决方法汇总整理...
>>> args = {'a':1,'b':2,'c':3} >>> args['d'] = 4 >>> f(**args) 1 2 3 4 ++ ...
- [转载] --- 让线程按顺序执行8种方法
看到一篇比较用心的总结,涉及到很多知识点,转来保存,而且我把里面的每个方法都试了一遍,亲测没问题 此次转载,还新增了一些说明和结构 我的总结: 其实,让线程按顺序执行,其实就是一个让多线程强行串行化的 ...
- 让线程按顺序执行 8 种方法
作者:俊俊的小熊饼干 cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为 ...
- 线程间通信的三种方法 (转)
http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html 线程间通信的三种方法 多线程通信的方法主要有以下三种: 1.全局变量 进 ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- 让线程按顺序执行8种方法(转载)
该文章为转载,出处:https://www.cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了7中方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中 ...
- 线程之间传递信息的几种方法 Android
一.需求分析 在使用okhttp的时候,有时会遇到需要在onresponse中将数据传送到其他线程中,或者是发送消息给UI线程,通知其更改UI的情况,并且我想返回的数据不是普通数据,而是一个类的对象. ...
最新文章
- JQuery:DOM操作
- mac+修改+ssh文件夹权限_用SSH指令批量修改文件夹 文件权限和拥有者
- 团队作业—系统设计和任务分配
- JDK,SDK,API之间的概念汇总
- 你以为PHP那么好自定义升级?
- [转]Stream 和 byte[] 之间的转换
- hg8245设置无线打印服务器,小编教您设置华为HG8245光纤猫路由器
- RS485收发的3种典型电路-重点-自动收发电路
- Python修改证件照底色,get新技能
- 初步学习CRM的感想
- 码农和程序员的区别,网友:月入三万以下全是码农!
- sccm服务器远程,sccm服务器是什么
- 如何在图片里藏其他文件
- 基于React Native和Ethers.js的电子钱包(二):路由和导航
- 设计师必看的十部电影
- Matlab:串联示例
- git学习笔记(全,附命令大全)
- 雷达PRI变化信号生成Matlab仿真
- 清除浏览器默认表单边框/背景特效和下拉菜单背景
- html仪表盘模版,【Minton v1.0.0】管理后台仪表盘HTML5模板