目录

  • 线程通信的定义
  • 轮询实现
    • 结论
  • wait和notify实现
    • wait方法
    • nofify方法
    • 结论
  • 补充说明

线程通信的定义

线程是程序中独立的个体,但这些个体如果不经过处理就不能成为一个整体。线程间的通信就是使它们成为整体的方案之一。
可以说通过线程通信,线程之间的交互性会更强大,能够大大提高CPU的复用率,同时也可以对线程任务进行有效的把控和监督

轮询实现

import lombok.SneakyThrows;
import java.util.ArrayList;
import java.util.List;
/*** 模拟厨师与服务员上菜* @author layman* @date 2021/2/7*/
public class Demo10 {public static void main(String[] args) {Cook cook = new Cook();WaiterA threadA = new WaiterA(cook);threadA.start();WaiterB threadB = new WaiterB(cook);threadB.start();}
}
class Cook {//强制线程从公共堆栈获取数据public volatile List<Integer> meal = new ArrayList();public void add() throws InterruptedException {for (int i = 1; i < 8 ; i++) {meal.add(i);System.out.println("第 "+i+" 道菜做好了");Thread.sleep(1000);}}
}
class WaiterA extends  Thread{private Cook cook;public WaiterA(Cook cook){this.cook = cook;}@SneakyThrows@Overridepublic void run() {while (true){cook.add();}}
}
class WaiterB extends  Thread{private Cook cook;public WaiterB(Cook cook){this.cook = cook;}@SneakyThrows@Overridepublic void run() {while (true){if(cook.meal.size() == 5){System.out.println("1号桌5个菜已经做好了,准备上菜");throw new InterruptedException();}}}
}

运行结果

结论

wait和notify实现


重点 : wait()会释放对象锁

wait方法

/*** 测试wait()只能在同步方法中调用*/
public class TestWait {private String name = "layman";public void methodA() throws InterruptedException{name.wait();}public void methodB() throws InterruptedException {synchronized (name){name.wait();}}public static void main(String[] args) throws InterruptedException {TestWait tw = new TestWait();tw.methodA();  //Exception in thread "main" java.lang.IllegalMonitorStateException// tw.methodB();}
}

nofify方法

import lombok.SneakyThrows;public class Demo12 {public static void main(String[] args) throws InterruptedException {Object obj = new Object();Demo12ThreadA threadA = new Demo12ThreadA(obj);threadA.start();//让主线程等待2秒钟Thread.sleep(2000);Demo12ThreadB threadB = new Demo12ThreadB(obj);threadB.start();}
}
class Demo12ThreadA extends  Thread{private Object lock;public  Demo12ThreadA(Object lock){setName("A线程");this.lock = lock;}@SneakyThrows@Overridepublic void run() {synchronized (lock){System.out.println(Thread.currentThread().getName()+"进入等待,时间为:"+System.currentTimeMillis());lock.wait();System.out.println(Thread.currentThread().getName()+"结束等待,时间为:"+System.currentTimeMillis());}}
}
class Demo12ThreadB extends  Thread{private Object lock;public  Demo12ThreadB(Object lock){setName("B线程");this.lock = lock;}@SneakyThrows@Overridepublic void run() {synchronized (lock){System.out.println(Thread.currentThread().getName()+"进行通知,时间为:"+System.currentTimeMillis());lock.notify();Thread.sleep(1000);}}
}

结论

  • wait()立刻释放对象锁,自身进入等待状态
  • notify()不会立刻释放对象锁,当同步代码块执行完毕后才会释放

补充说明

sleep(long millis)与wait(long timeout)的区别:sleep不会释放对象锁,而wait会

Thread之线程通信(wait和notify)相关推荐

  1. 多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用

    线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的 ...

  2. 线程通信wait与notify

    Wait/notify 可以实现线程间的通信 Wait方法,释放锁 Notify方法,不释放锁 Wait与notify方法 必须配置synchronize使用 package com.bjsxt.ba ...

  3. Java多线程(5)--线程通信wait和notify

    例题:使用两个线程打印 1-100.线程1, 线程2 交替打印. 解决:涉及wait()和notify()/notifyAll() class Communicate implements Runna ...

  4. java重点基础:线程和同步锁和线程通信

    学习线程的主要知识点概要如下: 进程和线程的区别:  *     1.进程:操作系统而言,进程就是程序,多进程就是多个程序同时执行  *         一个进程包含一个~多个线程,每一个进程都有自己 ...

  5. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  6. 高并发编程-线程通信_使用wait和notify进行线程间的通信

    文章目录 概述 场景 引子 synchronized wait/notify机制 synchronized wait/notify 改造 问题 概述 Java中线程通信协作的最常见的两种方式: syn ...

  7. 错误记录一:线程通信时抛出Exception in thread “Thread-0” java.lang.IllegalMonitorStateException异常

    错误记录一:线程通信时抛出Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 完整异常: ...

  8. 为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object类里

    关于wait().notify()的使用 public class WaitDemo {     public static Object object = new Object();        ...

  9. C++多线程:Linux 线程通信,唤醒,互斥锁(未完待续)

    c++ multi thread message sending and notify 线程通信常用的方法有共享内存和消息传递,推荐使用消息传递. 最常用的就是管道了,可以使用匿名管道或者命名管道. ...

最新文章

  1. 一个有趣的算法问题:如何定义一个分数类
  2. 网络编程五种IO模型之poll模型
  3. 从这3个方面,帮你大幅度提升用户的搜索体验
  4. Spring mvc HandlerMapping 实现机制
  5. 第17课 欧耶欧耶 《小学生C++趣味编程》
  6. 信息图:iOS 7开发者需要知道的事
  7. css3中的边框圆角border-radius的用法
  8. Bootstrap FileInput.js + springmvc uploadFile
  9. 怎么对神经网络重新训练,神经网络重建
  10. Word插入特殊符号
  11. F28335学习(二)EPWM
  12. spring boot oauth2 facebook
  13. 迅为4412开发板QtE4.7和Qtopia的切换
  14. ismobile什么意思_英语is是什么意思?
  15. 史上最完美的 Typora 教程
  16. 云原生周报 | 百度开源千万级CPS压测软件 dperf;BFE Server v1.5.0 发布
  17. 春运路上的“神笔马良”
  18. js-cookie读写浏览器中的Cookie及其应用
  19. 关于CSDN博客待审核的问题
  20. python PEP8 记录

热门文章

  1. java triplet_JavaTuples(元组)中的Triplet类 - Break易站
  2. 【情感识别】基于matlab BP神经网络语音情感识别【含Matlab源码 349期】
  3. 2023年网络安全HW面试经典收藏
  4. 阿里百秀后台管理项目笔记 ---- Day03
  5. 博客摘录「 各品牌网络监控摄像头RTSP地址查询」2023年5月23日
  6. 东方标准CEO吴雷的履历
  7. 记——凡科业务运维工程师面试总结(5.10)
  8. windows命令行cmd中查看显卡信息
  9. 弘辽科技:拼多多怎么会判定为提升销量?会有什么处罚?
  10. 崔永元缺席中国慈善年会 给农民工主持春晚