Java代码实现按序打印(多线程)

2023-11-16

使用synchronized关键字同步线程,线程会在while循环中等待条件满足。如果当前要打印的数字为1,则打印1,并将当前要打印的数字设置为2。最后,调用notifyAll()方法唤醒所有正在等待的线程,让它们继续执行。

class PrintSequence {
    private int current = 1;// 当前要打印的数字,初始为1
    private Object lock = new Object();// 定义一个用于同步线程的锁对象

    void printFirst() {
        synchronized (lock) {// 线程同步
            while (current != 1) {// 条件不满足时等待
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(1);// 打印1
            current = 2;// 设置下一个要打印的数字
            lock.notifyAll();// 唤醒其他正在等待的线程
        }
    }

    void printSecond() {
        synchronized (lock) {
            while (current != 2) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(2);
            current = 3;
            lock.notifyAll();
        }
    }

    void printThird() {
        synchronized (lock) {
            while (current != 3) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(3);
            current = 1;
            lock.notifyAll();
        }
    }

    public static void main(String[] args) {
        PrintSequence ps = new PrintSequence();// 创建PrintSequence对象
        new Thread(() -> { // 创建一个线程,调用printFirst()方法打印数字1
            for (int i = 0; i < 33; i++) {
                ps.printFirst();
            }
        }).start();
        new Thread(() -> {
            for (int i = 0; i < 33; i++) {
                ps.printSecond();
            }
        }).start();
        new Thread(() -> {
            for (int i = 0; i < 33; i++) {
                ps.printThird();
            }
        }).start();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java代码实现按序打印(多线程) 的相关文章

  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 恐造成下一个“千年虫”的闰秒,遭科技巨头们联合抵制

    整理 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews 近日 谷歌 Meta 微软和亚马逊四位科技巨头呼吁将闰秒取消 并称闰秒会对网络造成巨大影响 闰秒或将成为下一个类似 千年虫 bug的罪魁祸首 原来 除了闰年与闰月外 还有闰秒
  • Alibaba限流组件——Sentinel核心概念与流量控制

    目录 1 Sentinel介绍 1 1 Sentinel是什么 1 2 组成 1 3 关键概念 2 Sentinel流量控制案例 2 1 引入依赖 2 2 使用Sentinel提供的API实现流量控制 2 2 1 写一个有返回值的接口 2
  • MyBatis 工具学习笔记(基础)

    What s this 是一款优秀的持久层框架 用于简化 JDBC 开发 是 Apache 的一个开源项目 Java EE 三层架构 表现层 业务层 持久层 存储层 持久层 负责将数据保存到数据库的那一层代码 ORM Object Rela
  • Lumen开发:Lumen的异常处理机制

    版权声明 本文为博主原创文章 未经博主允许不得转载 Lumen的核心类Application引用了专门用于异常处理的RegistersExceptionHandlers class Application extends Container
  • 内存段分配方案

    复杂度3 5 机密度3 5 最后更新2021 04 21 每个进程都有自己的有效地址空间 这个地址空间有些段已经预先被分配或占用 共享 有些等待进程自己进行分配 对进程来说 有2个参数4种组合 32位或64位程序 内核态进程或者用户态进程
  • Spring Boot 静态资源处理(六)

    目录 1 Servlet 方式相同 2 Spring MVC 方式 2 1 为静态资源添加版本号 2 1 1 指定版本号 2 1 2 使用 MD5 作为版本号 2 2 gzip 压缩 3 3 chain cache 2 4 省略 webja
  • 【VUE - 工具 - TIFF】01、前端vue+tiffjs预览显示在线tiff图片

    前言 需求 通过其他工具前置切出来 并放在服务器目录下的tiff图片 项目需要在前端预览显示 实现方式 基于vue tiffjs实现 实现 1 实现效果 npm VUE实现 1 安装依赖 npm i tiff js S yarn add t
  • 计算机在多媒体技术中的应用,06多媒体技术在计算机试题中的应用.doc

    06多媒体技术在计算机试题中的应用 第1题 下列关于多媒体技术主要特征的描述 正确的是 A 多媒体信息必须是数字信息 B 计算机主要处理模拟信息 C 模拟数据是多媒体技术的核心 D Flash动画是模拟化数据 答案 A 第2题 存储一张20
  • http协议面试

    1 说一下什么是Http协议 对器客户端和 服务器端之间数据传输的格式规范 格式简称为 超文本传输协议 2 什么是Http协议无状态协议 怎么解决Http协议无状态协议 曾经去某创业公司问到 无状态协议对于事务处理没有记忆能力 缺少状态意味
  • CUDA详解-GPU架构

    每个线程有自己的私有本地内存 Local Memory 而每个线程块有包含共享内存 Shared Memory 可以被线程块中所有线程共享 其生命周期与线程块一致 此外 所有的线程都可以访问全局内存 Global Memory 还可以访问一
  • html图片加载太慢如何解决办法,如何解决CSS JS和图片对网站加载速度的影响

    对于网站加载速度的严格要求一致是seo优化过程中的重点 如何提升网站加载速度 服务器 网站内容元素等都有很大的关系 本篇文章将从CSS JS和图片三个方面进行详细的讲解 1 图片 1 指定图像尺寸 加载图像之前 您的浏览器开始渲染页面 制定
  • Remote Sensing 从投稿到录用

    一 刊物介绍 最新升级版大类分区仍然是二区TOP期刊 这个期刊现在业界褒贬不一 今年影响因子已经上升到4 848 可以作为一区文章被拒之后的首选 研究方向 无线传感器网络的定位与导航 投稿 Remote Sensing Remote Sen
  • RabbitMQ C++客户端 RabbitMQ Client for Windows/Linux 超简单接收发送接口-最近更新2019-09-06

    消息队列设计精要 解耦是消息队列要解决的最本质问题 所谓解耦 简单点讲就是一个事务 只关心核心的流程 而需要依赖其他系统但不那么重要的事情 有通知即可 无需等待结果 如果下游有很多系统关心你的系统发出的通知的时候 果断地使用消息队列吧 掰开
  • Docker 镜像使用

    目录 1 列出镜像列表 2 获取一个新的镜像 3 查找镜像 4 拖取镜像 5 删除镜像 6 创建镜像 a 更新镜像 b 构建镜像 设置镜像标签 当运行容器时 使用的镜像如果在本地中不存在 docker 就会自动从 docker 镜像仓库中下
  • Scala学习(九)---List集合

    文章目录 1 List 1 1 不可变List集合 1 2 可变集合ListBuffer 1 List List集合默认为不可变集合 List集合在实例化的时候 无法通过new关键字进行实例化 只能通过伴生apply方法来对其进行实例化 1
  • Ping操作 ICMP的数据包的分析(基础学习)

    学习链接 https zhuanlan zhihu com p 142665708 https blog csdn net weixin 43742894 article details 115415782 ICMP概述 全称interne
  • 机器学习-贝叶斯网络-笔记

    贝叶斯网络描述 1 贝叶斯网络 Bayesian network 又称信念网络 Belief Network 或有向无环图模型 directedacyclic graphical model 是一种概率图模型是一种模拟人类推理过程中因果关系
  • 内存泄漏分析

    原因 造成内存泄漏的网上很多 单例 handler 内部类持有外部类的对象 广播注册未反注册 静态变量 资源未释放等 工具 MAT 插件 可以直观的观察内存变化情况 dumpsys meminfo packagename 观察视图是否存在泄
  • (转)C++模板函数和重载

    C 模板函数和重载 先来看一个例子 include
  • Java代码实现按序打印(多线程)

    使用synchronized关键字同步线程 线程会在while循环中等待条件满足 如果当前要打印的数字为1 则打印1 并将当前要打印的数字设置为2 最后 调用notifyAll 方法唤醒所有正在等待的线程 让它们继续执行 class Pri