2.1什么是线程通信以及实现步骤

线程间通信的模型有两种:共享内存和消息传递
  线程通信其实就是 ,实现线程的交替工作,并传递信息

线程间的通信具体步骤:(涉及上中下部)

  1. 创建资源类,在资源类中船舰属性和操作方法
  2. 在资源类操作方法:判断、操作、通知
  3. 创建多个线程,调用资源类的操作方法
  4. 防止虚拟唤醒问题 (if 判读,只会判断一次)

2.2 synchronized案例

操作线程的时候,等待线程使用wait()
通知另外的线程操作用notify()、notifyAll()
假设有两个线程,该线程在执行过程中,判断值(不是该值等待,让其他线程抢),操作值,通知另外一个线程的调度

实现两个线程  对num  这个值操作,一个线程加1,一个线程减1,交替实现多次

//第一步 创建资源类,定义属性和操作方法
class Share {//初始值private int num = 0;//+1的方法public synchronized void incr() throws InterruptedException {//第二步 判断 干活 通知if(number != 0) { //判断number值是否是0,如果不是0,等待this.wait(); //在哪里睡,就在哪里醒}//如果number值是0,就+1操作number++;System.out.println(Thread.currentThread().getName()+" :: "+num);//通知其他线程this.notifyAll(); //注意这里的通知是随机的,就是只能通知全部}//-1的方法public synchronized void decr() throws InterruptedException {//判断if(number != 1) {this.wait();}//干活number--;System.out.println(Thread.currentThread().getName()+" :: "+number);//通知其他线程this.notifyAll();}
}public class ThreadDemo1 {//第三步 创建多个线程,调用资源类的操作方法public static void main(String[] args) {Share share = new Share();//创建线程new Thread(()->{for (int i = 1; i <=10; i++) {try {share.incr(); //+1} catch (InterruptedException e) {e.printStackTrace();}}},"AA").start();new Thread(()->{for (int i = 1; i <=10; i++) {try {share.decr(); //-1} catch (InterruptedException e) {e.printStackTrace();}}},"BB").start();}
}

可以看到,这时,代码是交替进行的 一个 +1 一个线程 -1

但是我们考虑如果同时 ,分别两个线程做加减,那会怎么样呢?

虚假唤醒 :  wait  是在哪里睡,在哪里被唤醒只做了一次判断   虚假唤醒 放在while   if 判断,只   会判断一次 所以改为while ;循环判断,就会解决虚假唤醒;从而解决这个错误

2.3 Lock案例

使用lock先要创建锁的对象以及通知的对象
放置在资源类中

private Lock lock= new ReentrantLock();   //创建可重锁private Condition  condition= lock.newCondition();//他能操作的对象

上锁 lock.lock();
解锁 lock.unlock();
以下都为 condition类:
唤醒所有等待的线程signalAll(),带上类名condition.signalAll();
唤醒一个等待线程signal(),带上类名,condition.signal();
造成当前线程在接到信号或者被中断之前一直处于等待状态await(),带上类名,condition.await();

Lock 实现的代码基本是相同的,注意上锁 和解锁 是自己手动 做的工作,最终都要在finally 解锁

如果不解锁,会影响下面以后的线程

class LShare{
//这是共享资源,注意锁的创建和使用,其他的和上面基本相同private int num=0;private Lock lock= new ReentrantLock();   //创建可重锁private Condition  condition= lock.newCondition();//创建操作的方法public void add (){lock.lock();   //首先 手动上锁;try {  //判断,干活,通知while (num!=0){condition.await();//它使用的是这个对象 调用方法 等待}num++;System.out.println( Thread.currentThread().getName()+" 干活完成 :"+num);condition.signalAll(); //这个通知方法} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock(); //最终不管出现什么错误,都会解锁}}

这就实现了线程间的通信,,即 他们能够根据 信息,完成交替的工作

     下面就是学如何 定制通信?(交替进行线程,但是每个线程的 工作是改变的)

 

2.什么是线程间的通信 ?怎么实现线程通信相关推荐

  1. 1线程概念:线程和进程之间的关系,线程间可共享资源,线程间非共享资源,线程的优缺点

     1线程概念 1.1什么是线程 1.1.2线程和进程的关系 1.轻量级进程(light-weightprocess),也有PCB,创建线程使用底层函数和进程一样,都是clone. 2.从内核里看进 ...

  2. C++编程思想 第2卷 第11章 并发 线程间协作 用队列解决线程处理的问题 适当地进行烘烤

    解决ToastOMatic.cpp存在的问题 可以在加工期间使用TQueue管理烤面包 需要实际的烤面包对象 它们保持显示了其状态 //: C11:ToastOMaticMarkII.cpp {Run ...

  3. Java 多线程(七) 线程间的通信

    Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...

  4. java面试-Java并发编程(六)——线程间的通信

    多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...

  5. 【JUC】第二章 线程间通信、集合的线程安全

    第二章 线程间通信.集合的线程安全 文章目录 第二章 线程间通信.集合的线程安全 一.线程间通信 1.介绍 2.synchronized 方案 3.Lock 方案 4.定制化线程通信 二.集合的线程安 ...

  6. c语言线程通信方式,线程间通信及同步方法介绍

    线程间如何通信/同步?此前小编给大家介绍了进程间通信的方法,于是一些伙伴又好奇线程间的通信及同步方法,没关系,下面小编就继续给大家科普下线程间通信及同步的方法. 线程间通信及同步方法介绍: 一.线程间 ...

  7. 线程间通信方式Linux,线程间的通信、同步方式与进程间通信方式

    1.线程间的通信方式 使用全局变量 主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile 使用消息实现通信 在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程 ...

  8. wxWidgets:线程间和进程间通信

    wxWidgets:线程间和进程间通信 wxWidgets:线程间和进程间通信 线程间通信 将事件发送到主线程 - 仅限 wxWidgets 3 向主线程发送事件 向主线程发送自定义事件 双向通讯 新 ...

  9. Python线程间通信方式

    1.python多线程 #! /usr/bin/evn python3 # --*-- coding: utf-8 --*--#该实例反编译来说明函数执行流程 import disdef add(a) ...

  10. Java线程间的通信方式

    文章目录 线程间通信的定义 一.等待-通知 (1)等待-通知机制的相关方法: (2)注意事项: (4)notify()方法的核心原理 (5)等待-通知机制的经典范式 (6)Thread.join() ...

最新文章

  1. 用.Net Reactor5打包加密dll文件和exe程序
  2. 转:mybatis - 分页功能
  3. GIS基础软件及操作(十)
  4. swagger生成示例_生成器设计模式示例
  5. 利用Gitee搭建个人图床(下)
  6. ruby+watir 安装
  7. 松下弧焊机器人 调电压_松下焊接机器人-基本操作篇.pdf
  8. 拆弹专家(密码BFS)
  9. dubbo+nacos+xml(nacos替换zookeeper)
  10. 11月14日:jquery
  11. 第16届全国大学生智能汽车竞赛——百度智慧交通赛项技术方案公开
  12. 改变生物学研究进程:AI模型打开生命信息密码
  13. 谷歌如何注册账号?手机号无法验证处理方法!2023年最新教程!
  14. 传播延迟与传输延迟以及带宽时延积
  15. 《电子测量与仪器学报》最新投稿经验2022.9
  16. 2022焊工(初级)考试题模拟考试题库及在线模拟考试
  17. 运营商客户流失率分析
  18. 搜索引擎常用技巧——英文资料篇
  19. 洞悉物联网发展1000问之试问工业互联网哪家强?附Top100强名单!
  20. [附源码]JSP+ssm计算机毕业设计小西商店的设计与开发8yd00【源码、数据库、LW、部署】

热门文章

  1. 阅文年营收76.3亿:提质增效 Non-IFRS归母净利增9.6%
  2. ROI Pooling
  3. 【美】约翰.佩里 - 拖拉一点也无妨(2013年11月4日)
  4. Unity 性能优化一:性能标准、常用工具
  5. 全球自动驾驶仿真平台盘点
  6. 这样优化Spring Boot,启动速度快到飞起!
  7. 安装ORACLE DATABASE 11g 时出现找不到文件错误
  8. linux 带ifdef运行程序_Linux内核如何装载和启动一个可执行程序
  9. JS函数声明和预解析的理解
  10. 用于商务联系的邮箱如何命名更为得体?