线程间通信的几种方法_并发编程中的线程间通信

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

线程通信常用的方式有:

  • wait/notify 等待
  • Volatile 内存共享
  • CountDownLatch 并发工具
  • 使用 ReentrantLock 结合 Condition
  • 基本LockSupport实现线程间的阻塞和唤醒

方式一:使用 volatile 关键字

基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式

87f810a1f96d5b68fda7e869e5f51d8e.png

运行结果为:

6c7dd1b267618bf539a5760a6422bf9e.png

方式二:使用Object类的wait() 和 notify() 方法

众所周知,Object类提供了线程间通信的方法:wait()、notify()、notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。

注意: wait和 notify必须配合synchronized使用,wait方法释放锁,notify方法不释放锁

1960ce3123072548284f2f1e43de5b1a.png

运行结果为

f37b0feaa38394904d663ce7aab3b7db.png

由打印结果截图可知,在线程A发出notify()唤醒通知之后,依然是走完了自己线程的业务之后,线程B才开始执行,这也正好说明了,notify()方法不释放锁,而wait()方法释放锁。

方式三:使用JUC工具类 CountDownLatch

jdk1.5之后在java.util.concurrent包下提供了很多并发编程相关的工具类,简化了我们的并发编程代码的书写,***CountDownLatch***基于AQS框架,相当于也是维护了一个线程间共享变量state

3f02ea71ed0d41886eaf1afcfce39e5c.png

运行结果为:

10326b8c27d464ee0536c004ee534c64.png

方式四:使用 ReentrantLock 结合 Condition

b34f3628e1ff2c2f776b8cdd55ac1e72.png

运行结果为:

d836bf100205b5be09c9ce0945b68276.png

显然这种方式使用起来并不是很好,代码编写复杂,而且线程B在被A唤醒之后由于没有获取锁还是不能立即执行,也就是说,A在唤醒操作之后,并不释放锁。这种方法跟 Object 的 wait() 和 notify() 一样。

方式五:基本LockSupport实现线程间的阻塞和唤醒

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

9af38e091d81641fa42aa312a5a7e757.png

运行结果

fb456a5c1ca7213162c390045afa2921.png

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

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

相关文章

【IOS】Target membership

Target membership是指XCode中,一个文件属于哪一个工程,在XCode左侧的工程面板中选中一个文件,在XCode右侧的属性面板中会显示其Target Membership,如下图。 当前的文件AppDelegate.m属于书谱这个Target。 Target Membership的一些…

LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)

文章目录1. 题目2. 解题1. 题目 给你两个长度可能不等的整数数组 nums1 和 nums2 。 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值&am…

LeetCode 1776. 车队 II(单调栈)

文章目录1. 题目2. 解题1. 题目 在一条单车道上有 n 辆车,它们朝着同样的方向行驶。 给你一个长度为 n 的数组 cars ,其中 cars[i] [positioni, speedi] ,它表示: positioni 是第 i 辆车和道路起点之间的距离(单位&…

wpf计算字符大小占像素_LCD作为终端显示字符串的过程

LCD作为终端显示字符串的过程1.本文目的2.资源评估3.显示原理4.嵌入式上汉字处理5.结果验证与展示6.总结1.本文目的做嵌入式图形开发,我们往往都会利用到各种GUI进行交互设计,但是对于GUI的字符串处理与中文字库显示,也许并不会特别关注&…

商城简单类图

转载于:https://www.cnblogs.com/stit/p/4125095.html

交换机的基本配置实验报告_无线网络设计配置即实验报告

工程师ACK接到一个小型图书馆的网络组建项目,根据目前流行的网络组建以及项目地点的使用需要便捷性,采用AC控制的瘦AP模式。不需要AC来管理网络的AP是胖AP需要单独配置,有多少个AP就要配置多少次。组建模式:一楼划分20个VLAN,二楼…

Java 集合框架(List、Set、Map、Iterator、Stack、Properties)

文章目录1. ArrayList2. LinkedList3. HashSet4. TreeSet5. Iterator、ListIterator6. HashMap7. TreeMap8. Stack9. Properties 类读写简单 数据库相关文献:https://www.runoob.com/java/java-collections.html 1. ArrayList 类似动态数组 ArrayList al new Arr…

js获取当前url_javascript如何获取当前URL的主机名?

在javascript中可以使用location对象的hostname属性或者host属性来获取当前URL的主机名,下面本篇文章就来带大家认识这两种属性,希望对大家有所帮助。使用location hostname属性location hostname属性是用于返回当前URL的主机名;它会返回一个…

java访问数据库方式_java数据库访问(二)—JDBC方式(配合连接池)

上文记录了最基础的JDBC连接数据库的方法,但能看出一个问题,就是要不断的重复去创建connection和关闭connection,如果在对数据库的访问比较频繁的情况下,这种处理方式方式在性能方面是不合适的,下面使用JDBC配合数据库…

超频真的不难!G3258超频4.5GHz全攻略

奔腾G3258搭配主板详解【pconline 应用】目前DIY市场上最火热的装机组合莫过于奔腾20周年纪念版处理器G3258搭配B85芯片组主板,只要通过适当的超频,相对较低投入也能来不错的性能体验,因此在奔腾G3258还没上市时,业界对其充满期待…

Java入门到精通——基础篇之static关键字

一、概述static 关键字是声明静态变量,静态方法用的。static的含义是属于类且不属于类对象的变量和函数。二、static的产生。在创建对象的时候除非用new创建那个类的对象,否则实际上并没有获得任何对象只有当执行new来创建对象时数据存储空间才被分配&am…

Java 给编译器看的注释--Annotation

文章目录1. 系统内建的Annotation2. 自定义Annotation3. Retention4. 反射 与 Annotation5. Target6. Documented7. Inherited将配置直接写入到程序之中:Annotation 1. 系统内建的Annotation Override,Deprecated,SuppressWarnings 等 cla…

kafka启动_Kafka安装部署——单节点

1.1 Kafka的单节点部署在实际的工作中,经常使用Kafka作为消息队列,然而并不是每一种业务场景都需要集群版的Kafka,有时单节点的Kafka就能满足了业务的需求。以下就是单节点kafka的部署流程:1.1.1 安装包下载从Kafka官网下载最…

Maven 入门 (1)—— 安装

Maven 入门 (1)—— 安装 http://blog.csdn.net/kakashi8841/article/details/17371837 1、下载maven安装包 http://maven.apache.org/download.cgi 2、基于Unix的操作系统(Linux、Solaris 和 Mac OS X) 解压上面下载的包&#xf…

中文新闻分类 数据集_三亚试点用大数据推行垃圾分类:刷卡扔垃圾,分类有奖励|界面新闻...

文丨海南日报 高懿 周月光10月19日电 ,垃圾分类如何推行?三亚市引进智能装备,在6个社区开展试点,运用大数据分析,通过行为激励,引导市民积极配合垃圾分类。19日上午,记者现场采访试点社区垃圾分…

为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_KDD2019: 使用神经网络为A*搜索算法赋能 --以个性化路径推荐为例...

本文系 KDD2019 论文的解读:Wang, Jingyuan, Ning Wu, Wayne Xin Zhao, Fanzhang Peng, and Xin Lin. "Empowering A* Search Algorithms with Neural Networks for Personalized Route Recommendation." InProceedings of the 25th ACM SIGKDD Internati…

java socket tomcat_在Tomcat环境下使用socket通信

最近在做一个APP的服务器端,但是APP和服务器端使用的是HTTP的通信协议,而另一方与服务器端通信却使用的是自定义的通信协议。具体的系统拓扑如下:为了完成以上的需求,一般的解决方案有两种:自己实现服务器端程序&#…

安卓手机主题软件_类似主题软件下载-类似主题安卓官方版下载v2.6.6.3

类似主题app,介绍给大家,是一款可以让我们在线进行主题变幻,拥有更多特色主题风格的服务平台。有了它用户就可以体验不同机型的主题风格,不论苹果还是安卓都是支持的,喜欢的不妨来下载看看!【类似主题应用功…

Java 文件 IO 操作

文章目录1. File类2. RandomAccessFile类3. 流类3.1 字节流3.2 字符流3.3 管道流3.4 ByteArrayInputStream、ByteArrayOutputStream3.5 System.in、System.out3.6 打印流 PrintStream3.7 DataInputStream、DataOutputStream3.8 合并流3.9 字节流与字符流的转换3.10 IO包类层次关…

java dsp_GitHub - Onemeaning/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...

JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示感谢。…