Thread之线程通信(wait和notify)
目录
- 线程通信的定义
- 轮询实现
- 结论
- 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)相关推荐
- 多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用
线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的 ...
- 线程通信wait与notify
Wait/notify 可以实现线程间的通信 Wait方法,释放锁 Notify方法,不释放锁 Wait与notify方法 必须配置synchronize使用 package com.bjsxt.ba ...
- Java多线程(5)--线程通信wait和notify
例题:使用两个线程打印 1-100.线程1, 线程2 交替打印. 解决:涉及wait()和notify()/notifyAll() class Communicate implements Runna ...
- java重点基础:线程和同步锁和线程通信
学习线程的主要知识点概要如下: 进程和线程的区别: * 1.进程:操作系统而言,进程就是程序,多进程就是多个程序同时执行 * 一个进程包含一个~多个线程,每一个进程都有自己 ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信
文章目录 概述 场景 引子 synchronized wait/notify机制 synchronized wait/notify 改造 问题 概述 Java中线程通信协作的最常见的两种方式: syn ...
- 错误记录一:线程通信时抛出Exception in thread “Thread-0” java.lang.IllegalMonitorStateException异常
错误记录一:线程通信时抛出Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 完整异常: ...
- 为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object类里
关于wait().notify()的使用 public class WaitDemo { public static Object object = new Object(); ...
- C++多线程:Linux 线程通信,唤醒,互斥锁(未完待续)
c++ multi thread message sending and notify 线程通信常用的方法有共享内存和消息传递,推荐使用消息传递. 最常用的就是管道了,可以使用匿名管道或者命名管道. ...
最新文章
- 一个有趣的算法问题:如何定义一个分数类
- 网络编程五种IO模型之poll模型
- 从这3个方面,帮你大幅度提升用户的搜索体验
- Spring mvc HandlerMapping 实现机制
- 第17课 欧耶欧耶 《小学生C++趣味编程》
- 信息图:iOS 7开发者需要知道的事
- css3中的边框圆角border-radius的用法
- Bootstrap FileInput.js + springmvc uploadFile
- 怎么对神经网络重新训练,神经网络重建
- Word插入特殊符号
- F28335学习(二)EPWM
- spring boot oauth2 facebook
- 迅为4412开发板QtE4.7和Qtopia的切换
- ismobile什么意思_英语is是什么意思?
- 史上最完美的 Typora 教程
- 云原生周报 | 百度开源千万级CPS压测软件 dperf;BFE Server v1.5.0 发布
- 春运路上的“神笔马良”
- js-cookie读写浏览器中的Cookie及其应用
- 关于CSDN博客待审核的问题
- python PEP8 记录