Java-线程通信

2023-11-16

Java-线程通信

1.线程通信中的三个方法

  1. wait()

    一旦执行此方式,当前线程就进入阻塞状态,并释放线程锁。

  2. notify()

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

  3. notifyAll()

    一旦执行此方法,就会唤醒所有被wait的线程。

    说明:

    • 上述三个方法只能出现在带锁的同步代码块或者方法块中。
    • 上述三个方法的调用者必须是同步代码块或者同步方法中的监视器。
    • 上述三个方法时定义在java.Object.lang包中的。

2.代码举例

package com.lmw.thread2;

/**
 * @author 
 * @version 1.0.0
 * @createTime 2022/5/14 16:13
 * @description 举例说明线程通信的三个方法
 */

public class CommunicationTest2 {
    public static void main(String[] args) {
        Number2 n1 = new Number2();
        Thread t1 = new Thread(n1);
        t1.start();
        Thread t2 = new Thread(n1);
        t2.start();

    }
}


class Number2 implements Runnable {
    private  int number = 1;


    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                //唤醒阻塞的线程
                notify();

                if(number <= 100) {
                    System.out.println(Thread.currentThread().getName() + " 打印,数字:" + number);
                    number ++;
                    
                    // 执行完之后 阻塞线程,并释放线程锁给其他线程
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }else {
                    break;
                }
            }

        }
    }
}

3.线程通信应用:生产者消费者问题

package com.lmw.thread2;

/**
 * @author 
 * @version 1.0.0
 * @createTime 2022/5/14 16:32
 * @description
 */

public class ProductTest {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();
        Productor p1 = new Productor(clerk);
        Customer c1 = new Customer(clerk);

        Thread t1 = new Thread(p1);
        t1.setName("生产者");
        t1.start();

        Thread t2 = new Thread(c1);
        t2.setName("消费者");
        t2.start();

    }
}

class Clerk {
    public int number = 0;

    /**
     *
     * @return true 继续生产 false 停止生产
     */
    public boolean isProduct() {
        return number < 20;
    }

    /**
     *
     * @return true 继续消费 false 停止消费
     */
    public boolean isCust() {
        return number >= 1;
    }


    public synchronized void produceProduct() {
            if(isProduct()) {
                number ++;
                // 阻塞线程,持锁
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":生产 1个 产品,店员还有产品数量:" + number);
                // 唤醒消费线程
                notify();

            }else {
                // 阻塞线程,先其他线程执行
                try {
                    System.out.println("停止生产,店员手里产品数量达到:" + number);
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

    }

    public synchronized void consumerProduct() {
            if(isCust()) {
                number -- ;
                System.out.println(Thread.currentThread().getName() + ":消费 1个 产品,店员还有产品数量:" + number);
                // 唤醒生产线程
                notify();
            }else {

                try {
                    System.out.println("停止消费,店员手里产品数量为:" + number);
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

    }



}

class Productor implements Runnable {
    private Clerk clerk;

    public Productor(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        while (true) {
            clerk.produceProduct();
        }

    }

}


class Customer implements Runnable {
    private Clerk clerk;

    public Customer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        while (true) {
            clerk.consumerProduct();
        }
    }
}

4.一些题目

  • sleep() 和 wait()的异同?
    • 相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
    • 不同点:
      • 两个方法声明的位置不同:Thread类中声明sleep() , Object类中声明wait()
      • 调用的要求不同:sleep()可以在任何需要的场景下调用。 wait()必须使用在同步代码块或同步方法中
      • 关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java-线程通信 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • ubuntu18-opencv3.4.6移植到aarch64

    一 前提条件 需先安装好arm64相关的交叉编译器 安装好cmake gui 下载并解压opencv3 4 6 下载ippicv 2019 lnx intel64 general 20180723 tgz 二 配置cmake 进入openc
  • Unity初学者学习路线与建议

    Unity初学者学习路线与建议 目录 Unity初学者学习路线与建议 一 前言 二 我的学习建议 三 学习要点 一 前言 Holle大家好 先自我介绍一下 我现在大二 专业是数字媒体技术 方向是游戏制作 学的是Unity 和我同专业的另一个
  • Ubuntu 16.04安装MinGW32

    直接使用命令 sudo apt get install mingw32 会报错 Unable to locate package mingw32 解决办法如下 sudo gedit etc apt sources list 在sources
  • ModBus-RTU详解

    Modbus 一个工业上常用的通讯协议 一种通讯约定 Modbus协议包括RTU ASCII TCP 其中MODBUS RTU最常用 比较简单 在单片机上很容易实现 虽然RTU比较简单 但是看协议资料 手册说得太专业了 起初很多内容都很难理
  • Mysql中字符串正确的连接方法

    虽然SQL server和My sql的语句基本都一致 但是仍然存在一些小区别 就如字符串的连接来说 SQL server中的字符串连接是使用 来连接 不带引号sql server是做加法运算 而my sql中无论是带引号和不带引号 它都将
  • 无缓存交换

    请编写一个函数 函数内不使用任何临时变量 直接交换两个数的值 给定一个int数组AB 其第零个元素和第一个元素为待交换的值 请返回交换后的数组 测试样例 1 2 返回 2 1 思路 使用异或 public int exchangeAB in
  • python3生成中文词云图

    usr bin python3 coding utf 8 coding utf 8 导入wordcloud模块 from wordcloud import WordCloud 中文分词库 pip install jieba import j
  • BMP to AVI 及其压缩的实现

    1 设计方案的产生 这个设计方案是物光院嵌入式系统试验室的基于CDMA技术的无线视频传输监控系统的设计的一部分 我简要说明此系统的原理 系统单片机部分主要模块由CDMA DSP与ARM处理器 FLASH ROM组成 此单片机用来获取监控所在
  • python+selenium 处理需要确定证书对话框

    场景如下 使用selenium 处理网页时 碰到了跳出证书的情况 如下图 所见 当使用get请求网页的时候 由于网页一直处于跳出状态 无法使用页面内容来进行操作 只能卡死在这一步 考虑到只需要在当前页面用鼠标点击或者键盘回车即可 但是sel
  • tomcat自带连接池dbcp配置以及优化说明

    转自 http www totcms com html 201602 29 20160229114145 htm 一个网站每天大概有20万的访问量 使用的tomcat自带dbcp连接池 一般网站访问很好 速度也很快 但是过一段时间后 总是报
  • VMware上pfsense开源防火墙的下载、安装、简单配置

    文章目录 1 pfsense概述 1 1 官方描述 1 2 个人描述 2 pfsense下载 2 1 官网下载 3 pfsense安装 3 1 官网手册 3 2 安装步骤 4 pfsense配置 4 1 默认账号密码 4 2 初始化配置 4
  • PyTorch学习笔记(三)PyTorch回归问题——分类问题

    PyTorch学习笔记 三 PyTorch回归问题 分类问题 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 一 pandas是什么 示例 pandas 是基于NumPy 的一种工具 该工具是为了
  • 性能测试的基本流程

    1 性能测试需求分析 项目经理 业务 架构专家 产品经理 高级性能测试工程师 开发经理 2 性能测试计划 高级性能测试工程师 项目经理 架构师 产品经理 3 性能测试准备 性能测试工程师 外部支持 网络工程师 系统管理员 测试服务器和被测试
  • 记录——企业课Python-科学计算(只学了Numpy、pandas和matplotlib.pyplot中的一些基础)

    一学期一次的企业课 大好的周末在机房度过 三个周日一个周六 感觉听的讲起来还不如自己看CSDN 顺带吐槽一下这个老师的评分 自己敲了一天整天最后得分82 同学复制粘贴过去87 更有甚者32学时课程结束 复制过来的代码连环境都没有都无法运行居
  • 微云存储空间多大_qq微云内存多大

    QQ微云容量最大多少 根据QQ微云官方的说法 可以达到100G 微云网盘怎么扩容 扩容方法可分为2种 一是登录QQ微云iPad版等获得额外的8G空间 二是参加每天签到活动获得额外的容量 下面就由学习啦小编为大家整理的相关信息 供大家参考 一
  • cmake构建多目录项目

    1 项目工程文件目录结构 2 源码 2 1 hello include hello h ifndef HELLOWORLD HELLO H define HELLOWORLD HELLO H extern void hello void e
  • 【Linux】【网络】应用层协议:HTTPS

    文章目录 HTTPS 1 加密方式 2 数据摘要 数据指纹 3 数字签名 HTTPS 的 工作过程 HTTPS 工作过程中的密钥 HTTP HTTPS HTTP HyperText Transfer Protocol 是客户端浏览器或其他程
  • 检测跟踪分割网络笔记

    模型247 97m GitHub SysCV pcan Prototypical Cross Attention Networks for Multiple Object Tracking and Segmentation NeurIPS
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java-线程通信

    Java 线程通信 1 线程通信中的三个方法 wait 一旦执行此方式 当前线程就进入阻塞状态 并释放线程锁 notify 一旦执行此方法 就会唤醒被wait的一个线程 如果有多个线程被wait 就唤醒优先级高的那个线程 notifyAll