线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。

线程通信常用的方式有:

  • 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 是一种非常灵活的实现线程间阻塞和唤醒的工具,使用它不用关注是等待线程先进行还是唤醒线程先运行,但是得知道线程的名字。

运行结果

线程间通信的几种方法_并发编程中的线程间通信相关推荐

  1. cas无法使用_并发编程中cas的这三大问题你知道吗?

    在java中cas真的无处不在,它的全名是compare and swap,即比较和交换.它不只是一种技术更是一种思想,让我们在并发编程中保证数据原子性,除了用锁之外还多了一种选择. 一.cas的思想 ...

  2. java实现分而治之_并发编程中一种经典的分而治之的思想!!

    写在前面 在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻辑执行完成后,再将各个结果进行汇总,得出最终的结果数据.有点像Hadoop中的MapRe ...

  3. python中遇到的问题及解决方法_自己编程中遇到的Python错误和解决方法汇总整理...

    >>> args = {'a':1,'b':2,'c':3} >>> args['d'] = 4 >>> f(**args) 1 2 3 4 ++ ...

  4. [转载] --- 让线程按顺序执行8种方法

    看到一篇比较用心的总结,涉及到很多知识点,转来保存,而且我把里面的每个方法都试了一遍,亲测没问题 此次转载,还新增了一些说明和结构 我的总结: 其实,让线程按顺序执行,其实就是一个让多线程强行串行化的 ...

  5. 让线程按顺序执行 8 种方法

    作者:俊俊的小熊饼干 cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为 ...

  6. 线程间通信的三种方法 (转)

    http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html 线程间通信的三种方法 多线程通信的方法主要有以下三种:  1.全局变量 进 ...

  7. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  8. 让线程按顺序执行8种方法(转载)

    该文章为转载,出处:https://www.cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了7中方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中 ...

  9. 线程之间传递信息的几种方法 Android

    一.需求分析 在使用okhttp的时候,有时会遇到需要在onresponse中将数据传送到其他线程中,或者是发送消息给UI线程,通知其更改UI的情况,并且我想返回的数据不是普通数据,而是一个类的对象. ...

最新文章

  1. JQuery:DOM操作
  2. mac+修改+ssh文件夹权限_用SSH指令批量修改文件夹 文件权限和拥有者
  3. 团队作业—系统设计和任务分配
  4. JDK,SDK,API之间的概念汇总
  5. 你以为PHP那么好自定义升级?
  6. [转]Stream 和 byte[] 之间的转换
  7. hg8245设置无线打印服务器,小编教您设置华为HG8245光纤猫路由器
  8. RS485收发的3种典型电路-重点-自动收发电路
  9. Python修改证件照底色,get新技能
  10. 初步学习CRM的感想
  11. 码农和程序员的区别,网友:月入三万以下全是码农!
  12. sccm服务器远程,sccm服务器是什么
  13. 如何在图片里藏其他文件
  14. 基于React Native和Ethers.js的电子钱包(二):路由和导航
  15. 设计师必看的十部电影
  16. Matlab:串联示例
  17. git学习笔记(全,附命令大全)
  18. 雷达PRI变化信号生成Matlab仿真
  19. 清除浏览器默认表单边框/背景特效和下拉菜单背景
  20. html仪表盘模版,【Minton v1.0.0】管理后台仪表盘HTML5模板

热门文章

  1. 莒南机器人_莒南42项重点建设项目公布!一定有你关注的
  2. iOS: 属性声明strong和retain竟然不一样
  3. MS SQL Server 常用操作
  4. mysql分组之后统计数量
  5. 微信开发学习日记(一):快速阅读5本书,掌握整体背景
  6. 查看系统表存储过程名称
  7. mysql 8.0 一条insert语句的具体执行流程分析(二)
  8. 单片机检测220V交流电通断电路
  9. Linux内核系统架构介绍
  10. STM32——串口通信