等待通知机制就是将处于等待状态的线程将由其它线程发出通知后重新获取CPU资源,继续执行之前没有执行完的任务。最典型的例子生产者–消费者模式
生产者想要在队列中添加产品,消费者需要从队列中取出产品,如果队列为空,消费者应该等待生产者添加产品后才进行消费,队列为满时,生产者需要等待消费者消费一部分产品后才能继续生产。队列可以认为是java模型里的临界资源,生产者和消费者认为是不同的线程,它们需要交替的占用临界资源来进行各自方法的执行,所以就需要线程间通信。
等待/通知机制主要提供了三个方法用于线程间的通信
wait()当前线程释放锁并进入等待(阻塞)状态
notify()唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后继续竞争锁
notifyAll()唤醒所有正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后继续竞争锁
等待/通知机制是指一个线程A调用了对象Object的wait()方法进入等待状态,而另一线程B调用了对象Object的notify()或者notifyAll()方法,当线程A收到通知后就可以从对象Object的wait()方法返回,进而执行后序的操作。线程间的通信需要对象Object来完成,对象中的wait()、notify()、notifyAll()方法就如同开关信号,用来完成等待方和通知方的交互。
等待/通知的相关方法:
场景—两个线程,一个线程对当前数值加1,另一个线程对当前数值减1,一共执行10次
假设这个共享变量的初始值为0,一个线程t1对值+1,另一个线程t2对值-1.
package com.dongguo.concurrent.waitnotify;
/**
* @author Dongguo
* @date 2021/9/3 0003-13:15
* @description: 生产者消费者
* 场景---两个线程,一个线程对当前数值加1,另一个线程对当前数值减1,一共执行10次
* 假设这个共享变量的初始值为0,一个线程对值+1,另一个线程对值-1.
*/
public class ThreadWaitNotifyDemo {
public static void main(String[] args) {
Number number = new Number();
new Thread(() -> {
for (int i = 0; i {
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?