线程通信

news2024/11/16 5:46:06

线程通信

线程通信指的是多个线程通过相互牵制,相互调度,即线程间的相互作用

涉及的三个方法:

.wait 一旦执行此方法,当前线程就进入到阻塞状态,并释放同步监视器

.notify 执行此方法,就会唤醒被wait的一个线程.如果有多个线程被wait,那么就会先唤醒优先级最高的那个

.notifyAll 执行此方法,会唤醒所有被wait的线程

注意:以上三个方法必须使用在同步代码块或同步方法中

wait():必须在同步代码块中使用

必须是使用同步锁对象调用wait()

wait()调用后,锁会释放

必须要通过其他线程来唤醒

经典案例:生产者/消费者问题

生产者(Productor)将产品放在柜台(Counter),而消费者(Customer)从柜台处取走产品,生产者一次只能生产固定数量的产品(比如:1),这时柜台中不能再放产品,此时生产者应停止生产等待消费者拿走产品,此时生产者唤醒消费者来取走产品,消费者拿走产品后,唤醒生产者,消费者开始等待

/*
   柜台 放商品  共享数据
 */
public class Counter {
​
    int num = 0;
​
    /*
      生产者生产商品
      synchronized修饰的是非静态方法 锁是this   就是counter对象,只有一个
     */
​
    public synchronized void add(){
        if (num==0){
            num++;
            System.out.println("生产者生产商品");
            this.notify();//唤醒消费者
        }else {
            try {
                this.wait();// 有商品,生产者等待  释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
​
    /*
       消费者取走商品
     */
    public synchronized void sub(){
        if (num==0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }else {
            num--;
            System.out.println("消费者拿走了商品");
            this.notify();// 唤醒生产者
        }
    }
}
/*
  生产者线程
 */
public class ProductorThread extends Thread {
​
    Counter c;
​
    public ProductorThread(Counter c) {
        this.c = c;
    }
​
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            c.add();
        }
    }
}
/*
  消费者线程
 */
public class CustomerThread extends Thread {
    Counter c;
​
    public CustomerThread(Counter c) {
        this.c = c;
    }
​
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            c.sub();
        }
    }
}
public class Test {
​
    public static void main(String[] args) {
​
        Counter counter = new Counter();// 柜台 只有一个,是共享数据
​
        ProductorThread p = new ProductorThread(counter);
        CustomerThread c = new CustomerThread(counter);
        p.start();
        c.start();
    }
}

执行结果:

 

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

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

相关文章

HybridFusion: LiDAR和视觉交叉源点云融合

一、基本信息 研究方向: 大场景点云配准 HybridFusion: 它可以在户外大型场景中从不同视角记录交叉源密集点云。 团队链接:http://www.adv-ci.com 视频链接: https://www.bilibili.com/video/BV1vM41147yD/?spm_id_from333.337.sear…

蓝桥杯真题(解码)小白入!

本来看这个题感觉很简单,不就是Ascall值换来换去嘛,其实也真的这样,但是对于小白来说,ascall根本记不住 题目说了,每个数不会重复超过9次(这见到那多了,不然根本不会写) 其次如何实现…

2023年再不会Redis,就要被淘汰了

目录专栏导读一、同样是缓存,用map不行吗?二、Redis为什么是单线程的?三、Redis真的是单线程的吗?四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…

Spring-Cloud-Gateway集成Nacos如何做负载均衡?

spring-cloud-alibaba的低版本 如果所用的SpringCloud和Nacos的版本信息如下&#xff1a; <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>网关的依赖如下&…

VirtualBox虚拟机闪退后如何重新打开

电脑&#xff08;Mac系统&#xff09;由于某种问题自动重启了&#xff0c;重启后之前在用的VirtualBox&#xff08;虚拟机管理器&#xff09;能恢复运行&#xff0c;但VirtualBoxVM&#xff08;虚拟机终端&#xff09;进程已停止&#xff0c;点击管理器的「显示」也出现报错&am…

我国防疫数据报告,2022年广东花费711亿,北京人均支出第一

哈喽大家好&#xff0c;2023年已经过去一段时间了&#xff0c;随着防疫策略的调整&#xff0c;小伙伴们是不是开始到处旅行购物了呢&#xff1f;当然了&#xff0c;对于自身的健康情况小伙伴们还是要多多关注&#xff0c;不要松懈。随着春节过后有序复工复产&#xff0c;各地纷…

三叉神经痛是怎么回事?给予2个生活建议!

三叉神经痛被称为天下第一痛&#xff0c;三叉神经支配区域反复出现短暂性阵发性剧痛&#xff0c;发作时让人们备受折磨。近期早晚温差大和天气变化多端&#xff0c;可刺激肌肉和血管收缩&#xff0c;导致三叉神经异常放电&#xff0c;进而引起剧烈疼痛&#xff0c;诱发三叉神经…

ChatGPT强化学习大杀器——近端策略优化(PPO)

ChatGPT强化学习大杀器——近端策略优化&#xff08;PPO&#xff09; 近端策略优化&#xff08;Proximal Policy Optimization&#xff09;来自 Proximal Policy Optimization Algorithms&#xff08;Schulman et. al., 2017&#xff09;这篇论文&#xff0c;是当前最先进的强…

【学习笔记】深入理解JVM之垃圾回收机制

【学习笔记】深入理解JVM之垃圾回收机制 更多文章首发地址&#xff1a;地址 参考&#xff1a; 《深入理解JAVA虚拟机》第三版 第三章尚硅谷 第134 - 203 集参考文章&#xff1a;https://blog.csdn.net/qq_48435252/article/details/123697193 1、概念 &#x1f33b; 首先我们…

Mock.js介绍及使用总结

1 什么是Mock.js Mock.js用于生成随机的模拟数据&#xff0c;拦截 Ajax 请求&#xff0c;返回伪造的数据。因此在前端开发阶段就可以通过这个工具进行沉浸式开发&#xff0c;实现数据自产自销&#xff0c;降低和后端的沟通成本&#xff0c;实现真正意义上的前后端开发解耦合。…

2023年轻资产创业怎么做?哪些项目容易创业?

2023年&#xff0c;越来越多的创业者开始考虑轻资产创业&#xff0c;但是&#xff0c;多数人在选择项目的时候&#xff0c;没有一个标准&#xff0c;不知道怎么选择轻资产创业项目&#xff0c;那么&#xff0c;在这里给大家讲讲&#xff0c;轻资产创业怎么做&#xff0c;哪些轻…

反思当下所处的环境,有没有让你停滞不前、随波逐流

环境对人的影响真的很大&#xff0c;小时候的环境、长大后的环境、工作环境、生活环境、好的环境、差的环境......我们都生活在一定的环境中所以既是环境的产物&#xff0c;又是环境的创造者与改造者。我们与环境的关系是相辅相成的我们的生活和工作当中接触到的人或事或物&…

emac接口与phy交互

nuc970的emac接口 nuc970的EMAC以太网接口与PHY芯片之间的数据交换是通过MII&#xff08;Media Independent Interface&#xff09;或RMII&#xff08;Reduced Media Independent Interface&#xff09;接口实现的。 在MII接口中&#xff0c;EMAC和PHY之间通过4对数据线&…

C语言:当scanf语句中有转义字符时,你该这样输入

最近在重新学习一下C语言的有关知识&#xff0c;突然发现现在来看过去所学的知识&#xff0c;自己的感受又有很大的不同&#xff0c;就拿输入语句scanf来说吧&#xff01;看到CSDN问答上有一个关于scanf语句的问题&#xff0c;当时题主代码很简单&#xff0c;可是就是没有输出语…

idea:地址被占用

问题启动idea报&#xff1a;java.net.BindException: Address already in use: bind&#xff0c;具体截图如下&#xff1a;解决步骤1、首先想到的是改idea端口&#xff0c;但按网上方法试下了几个4位数和5位数的端口&#xff0c;没啥作用2、根据idea抛异常的弹出框提示&#xf…

在函数中,用指针接收就可以改变相应的内容吗??

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 我们在不管指针那篇博客&#xff0c;还是在函数那篇博客中&#xff0c;我都给大家讲解过…

Unity 打包代码到 DLL

Unity 打包代码到 DLL 使用Unity API PlayerBuildInterface.CompilePlayerScripts 将项目中的代码生成为 DLL 程序集 在 Editor 文件夹下新建脚本 CompileDll using UnityEngine; using UnityEditor; using UnityEditor.Build.Player; using System.IO;public class Compile…

【springmvc】获取请求参数

SpringMVC获取请求参数 1、通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 RequestMapping("/testParam") public String testParam(HttpServletRequest request)…

Allegro如何输出ODB文件操作指导

Allegro如何输出ODB文件操作指导 在PCB设计完成之后,需要输出生产文件用于生产加工,除了gerber文件可以用生产制造,ODB文件同样也可以用于生产,如下图 用Allegro如何输出ODB文件,具体操作如下 首先确保电脑上已经安装了ODB这个插件,版本不受限制点击File

开学季准备哪些电容笔好?apple pencil一代平替笔推荐

一支简单而又易用的电容笔&#xff0c;配上我们的ipad&#xff0c;将会为我们的工作、学习带来更多的乐趣。在画画时&#xff0c;也不能忽略电容笔的重要作用。关于电容笔的相关知识&#xff0c;本人也略有知不少&#xff0c;以下是我今天要带来的几款具有极高性价比的电容笔&a…