当前位置: 首页 > article >正文

两个线程循环打印奇偶数

题目要求两个线程循环打印奇偶数。1.示例1输入7输出OddThread: 1EvenThread: 2OddThread: 3EvenThread: 4OddThread: 5EvenThread: 6OddThread: 72.示例2输入5输出OddThread: 1EvenThread: 2OddThread: 3EvenThread: 4OddThread: 5附代码一、方法一ReentrantLock Conditionclass PrintOddEven { // 成员变量字段用于存储对象状态在整个类中都可以使用 // 表示当前要打印的数字是从1开始打印 private int num 1; // 表示结尾数字 private final int max; // 可重入锁 private final ReentrantLock lock new ReentrantLock(); // 创建一个与该锁绑定的等待队列oddCondition用于管理线程的等待和唤醒 private final Condition oddCondition lock.newCondition(); // 奇数线程的等待队列 private final Condition evenCondition lock.newCondition(); // 偶数线程的等待队列 public PrintOddEven(int max) { // 构造方法参数用于从外部接收传入的值 this.max max; // 把参数的值赋给成员变量 } // 奇数线程 public void printOdd() { while (num max) { // 循环没超过最大值的时候才打印 lock.lock(); // 获取锁 try { if (num % 2 ! 0) { // 如果是奇数 // 打印该奇数 System.out.println(Thread.currentThread().getName() : num); num; // 唤醒偶数线程 evenCondition.signal(); } // 如果是偶数 else { // 奇数线程等待 oddCondition.await(); } // 捕获await()线程在等待期间其他线程调用interrupt()抛出的InterruptedException异常 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } public void printEven() { while (num max) { lock.lock(); try { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; oddCondition.signal(); } else { evenCondition.await(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } }二、方法二Synchronized wait/notifyclass PrintOddEven { private int num 1; private final int max; private final Object lock new Object(); public PrintOddEven(int max) { this.max max; } public void printOdd() { synchronized (lock) { while (num max) { if (num % 2 ! 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } public void printEven() { synchronized (lock) { while (num max) { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } }三、方法三使用信号量 Semaphore最简洁class PrintOddEven { private int num 1; private final int max; private final Semaphore oddSemaphore new Semaphore(1); private final Semaphore evenSemaphore new Semaphore(0); public PrintOddEven(int max) { this.max max; } public void printOdd() { while (num max) { try { oddSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } evenSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } public void printEven() { while (num max) { try { evenSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } oddSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } }ACM模式一、方法一ReentrantLock Conditionimport java.util.Scanner; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; class PrintOddEven { // 成员变量字段用于存储对象状态在整个类中都可以使用 // 表示当前要打印的数字是从1开始打印 private int num 1; // 表示结尾数字 private final int max; // 可重入锁 private final ReentrantLock lock new ReentrantLock(); // 创建一个与该锁绑定的等待队列oddCondition用于管理线程的等待和唤醒 private final Condition oddCondition lock.newCondition(); // 奇数线程的等待队列 private final Condition evenCondition lock.newCondition(); // 偶数线程的等待队列 public PrintOddEven(int max) { // 构造方法参数用于从外部接收传入的值 this.max max; // 把参数的值赋给成员变量 } // 奇数线程 public void printOdd() { while (num max) { // 循环没超过最大值的时候才打印 lock.lock(); // 获取锁 try { if (num % 2 ! 0) { // 如果是奇数 // 打印该奇数 System.out.println(Thread.currentThread().getName() : num); num; // 唤醒偶数线程 evenCondition.signal(); } // 如果是偶数 else { // 奇数线程等待 oddCondition.await(); } // 捕获await()线程在等待期间其他线程调用interrupt()抛出的InterruptedException异常 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } public void printEven() { while (num max) { lock.lock(); try { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; oddCondition.signal(); } else { evenCondition.await(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } } public class Main { public static void main(String[] args) throws InterruptedException { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); // 传入参数n用于后续构造方法接收参数max并把参数的值赋值给成员变量this.max(private final int max) PrintOddEven printOddEven new PrintOddEven(n); // 里存放的是线程名称会被子函数的Thread.currentThread().getName()获取到 Thread oddThread new Thread(() - printOddEven.printOdd(), OddThread); Thread evenThread new Thread(() - printOddEven.printEven(), EvenThread); oddThread.start(); evenThread.start(); oddThread.join(); evenThread.join(); scanner.close(); } }二、方法二Synchronized wait/notifyimport java.util.Scanner; class PrintOddEven { private int num 1; private final int max; private final Object lock new Object(); public PrintOddEven(int max) { this.max max; } public void printOdd() { synchronized (lock) { while (num max) { if (num % 2 ! 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } public void printEven() { synchronized (lock) { while (num max) { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } } public class Main { public static void main(String[] args) throws InterruptedException { Scanner scanner new Scanner(System.in); // 读取最大值 int n scanner.nextInt(); PrintOddEven printOddEven new PrintOddEven(n); // 创建两个线程 Thread oddThread new Thread(() - printOddEven.printOdd(), OddThread); Thread evenThread new Thread(() - printOddEven.printEven(), EvenThread); // 启动线程 oddThread.start(); evenThread.start(); // 等待线程结束 oddThread.join(); evenThread.join(); scanner.close(); } }三、方法三使用信号量 Semaphore最简洁import java.util.Scanner; import java.util.concurrent.Semaphore; class PrintOddEven { private int num 1; private final int max; private final Semaphore oddSemaphore new Semaphore(1); private final Semaphore evenSemaphore new Semaphore(0); public PrintOddEven(int max) { this.max max; } public void printOdd() { while (num max) { try { oddSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } evenSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } public void printEven() { while (num max) { try { evenSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } oddSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } public class Main { public static void main(String[] args) throws InterruptedException { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); PrintOddEven printOddEven new PrintOddEven(n); Thread oddThread new Thread(() - printOddEven.printOdd(), OddThread); Thread evenThread new Thread(() - printOddEven.printEven(), EvenThread); oddThread.start(); evenThread.start(); oddThread.join(); evenThread.join(); scanner.close(); } }

相关文章:

两个线程循环打印奇偶数

题目要求:两个线程循环打印奇偶数。1.示例1:输入:7输出:OddThread: 1 EvenThread: 2 OddThread: 3 EvenThread: 4 OddThread: 5 EvenThread: 6 OddThread: 72.示例2:输入:5输出:OddThread: 1 Ev…...

算法训练营第十六天 | 反转字符串 II

今日训练题:541. 反转字符串 II 思路: 把字符串按「每 2k 个字符」分成一段一段,每一段里,只反转前 k 个字符,后 k 个保持不变;如果最后一段不足 2k 个字符,就按规则处理。 代码如下&#xff1a…...

Win11笔记本耳机没弹窗?手把手教你修复Realtek Audio Console的RPC连接问题

Win11耳机弹窗消失?深度解析Realtek音频驱动RPC连接修复指南 引言:当科技便利变成日常烦恼 清晨七点,小王习惯性戴上耳机准备开始一天的工作,却发现笔记本毫无反应——那个熟悉的设备选择弹窗消失了。这不是个例,自Win…...

Pandas可视化

目录 一.单变量可视化 1.柱状图 2.折线图 3.面积图 4.直方图 5.饼状图 二.双变量可视化 1.散点图 2.蜂窝图 3.堆叠图 4.折线图 pandas提供了非常方便的绘图功能,可以直接在DataFrame或Series上调用plot()方法来生成各种类型的图表。底层实现依赖于Matplo…...

OO第二单元博客

第二单元 多线程电梯 学习总结报告 一、三次作业同步块设置、锁的选择及锁与代码逻辑的关系 回顾本单元三次电梯迭代作业,我对于锁的概念与使用、临界区保护、线程共享和资源竞争有了完整的实践理解。 在整体代码结构中,我主要采用对象锁的方式进行并发控…...

如何快速搭建本地语音识别系统:高效隐私保护的完整指南

如何快速搭建本地语音识别系统:高效隐私保护的完整指南 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech TMSpeech是一款完全本地化的Windows实时语音转文字工具,通过创新的插件化架构和多源音…...

LLM作为AI对话评估裁判的实践与优化

1. 项目背景与核心问题去年参与一个AI对话系统评测项目时,我们遇到一个棘手问题:人工评估成本太高,不同评审员的标准差异大。当时团队尝试用GPT-4作为辅助裁判,意外发现它在某些维度比人类评审更稳定。这个发现促使我系统性地研究…...

LongWayToGo

1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...

跟着 MDN 学 HTML day_3:(表单CSS美化实战与盒子模型三大核心属性详解)

一、学习前言 本次是跟着MDN官方文档零基础攻坚HTML前端系列的第三天学习打卡。前两天我们已经完整吃透原生表单语义结构、全套实用表单控件、表单name和value键值对提交底层原理,能独立手写合规可提交的原生基础表单。 原生默认表单自带浏览器原生丑陋样式&#xf…...

用MATLAB复现MIMO信道容量仿真:从瑞利信道建模到注水法代码详解

MIMO信道容量仿真实战:从瑞利建模到注水算法的MATLAB实现解析 在无线通信系统的演进历程中,多输入多输出(MIMO)技术堪称是突破性的创新。它通过在收发两端配置多个天线,巧妙利用空间维度资源,实现了通信容量…...

AlphaOPT:基于LLM自改进经验库的智能优化框架

1. 项目概述AlphaOPT是一个基于自改进大语言模型(LLM)经验库的优化程序构建框架。这个项目最吸引我的地方在于它创造性地将LLM的自我学习能力与传统优化算法相结合,形成了一种新型的智能优化范式。在实际工程优化问题中,我们常常会遇到传统算法收敛慢、易…...

抖音下载神器:5分钟掌握批量无水印下载技巧

抖音下载神器:5分钟掌握批量无水印下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…...

苹果微软双修党福音:Navicat如何熟悉Mac版专属快捷键_硬核实战技巧

Cmd Y 新建查询窗口,Cmd R 运行全部,F8 运行选中或当前行,Cmd Shift R 仅运行选中部分;双击表名或 Cmd D 跳转结构页;Ctrl Shift 数字秒开收藏对象;Shift Cmd C 打开数据库原生命令行。Mac版Navic…...

如何用Faster-Whisper-GUI实现高效音频视频转文字

如何用Faster-Whisper-GUI实现高效音频视频转文字 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 你是否曾为整理会议录音、制作视频字幕或转录课程内容而烦恼?手动…...

开源色彩管理革命:OpenColorIO配置为ACES的终极指南

开源色彩管理革命:OpenColorIO配置为ACES的终极指南 【免费下载链接】OpenColorIO-Config-ACES 项目地址: https://gitcode.com/gh_mirrors/op/OpenColorIO-Config-ACES 在数字内容创作领域,色彩一致性是专业制作的生命线。OpenColorIO配置为ACE…...

STL核心:vector动态数组完全指南

一、STL 整体介绍STL 是 C 标准模板库,三大核心组件:容器:存放数据(vector、string、list、map 等)算法:排序、查找、遍历、交换迭代器:容器通用访问指针STL 优势:无需手动造轮子&am…...

保姆级教程:Ubuntu 20.04/18.04系统下Atlas 300i Pro/T 芯片驱动、CANN 6.3.RC1及MindSpore 2.0环境配置详解

昇腾AI开发环境全栈配置指南:Ubuntu系统下的Atlas 300i Pro/T芯片实战 在AI算力需求爆炸式增长的今天,企业级AI加速卡的环境配置效率直接决定了算法团队的研发效能。本文将深入解析基于Ubuntu 18.04/20.04的昇腾Atlas 300i Pro/T系列加速卡全栈开发环境搭…...

ChatGPT机器人集成实战:从API调用到生产级对话系统构建

1. 项目概述:一个为机器人开发者准备的ChatGPT文档库如果你正在开发一个聊天机器人、智能客服,或者任何需要接入自然语言对话能力的应用,那么你大概率已经听说过ChatGPT的API。它的能力毋庸置疑,但官方文档更多是面向通用场景的AP…...

AI也有“失忆症“?Kenotic Labs提出的“连续性层“或许是彻底的解法

这项由Kenotic Labs独立研究机构发布的论文,于2026年4月以预印本形式公开,编号为arXiv:2604.17273,作者为该机构创始人Samuel Sameer Tanguturi。有兴趣深入了解的读者可通过该编号在arXiv平台查阅完整论文。每次打开一个AI对话窗口&#xff…...

从‘遗忘’到‘更新’:用PyTorch拆解GRU的门控逻辑,可视化理解它为何比LSTM更简单

从‘遗忘’到‘更新’:用PyTorch拆解GRU的门控逻辑,可视化理解它为何比LSTM更简单 循环神经网络(RNN)在处理序列数据时表现出色,但在面对长序列时常常会遇到梯度消失或爆炸的问题。为了解决这个问题,研究者…...

基于Alexa与GPT-4构建智能语音助手:从架构设计到部署实践

1. 项目概述与核心价值 最近在折腾智能家居和语音助手,发现一个挺有意思的开源项目,叫 alexandremendoncaalvaro/skill-alexa-chatgpt4 。简单来说,这是一个能让你的亚马逊 Alexa 设备(比如 Echo 音箱)直接调用 Cha…...

IBM Plex字体:企业级开源字体解决方案完全指南

IBM Plex字体:企业级开源字体解决方案完全指南 【免费下载链接】plex The package of IBM’s typeface, IBM Plex. 项目地址: https://gitcode.com/gh_mirrors/pl/plex 你是否曾为寻找一款既专业又免费、既美观又实用的字体而烦恼?🤔 …...

Vernclaw Connect CLI:命令行网络隧道与连接管理的瑞士军刀

1. 项目概述与核心价值 最近在折腾一些需要跨网络、跨设备进行安全通信和管理的自动化脚本时,遇到了一个痛点:如何在不依赖复杂图形界面和重型管理平台的情况下,快速、安全地建立点到点的连接,并执行远程命令或文件传输&#xff1…...

构建人格化AI聊天系统:从提示工程到向量记忆的实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的东西,一个名为sys-fairy-eve/nightly-mvp-2026-03-28-g0dm0d3-persona-chat的项目。光看这个标题,信息量就很大,它不像一个传统的软件应用,更像是一个特定版本、特定功能的“角色”…...

Hermes Agent 15 个隐藏特性

99% 的用户只用了 8%,把价值百万的 Agent 当成了“高级 Telegram 机器人” 在 AI Agent 工具的讨论里,几乎所有人都默认了一个前提:Hermes 就是“更聪明的 ChatGPT Telegram 集成”。装好、连模型、打字、等回复、关窗口,任务完成…...

Kimi K2.6 + Claude 多代理路由栈

开发者还在为“哪家AI编码工具最好”站队,而真正出货最多的那批人早已把周账单砍到1/7 在 AI 编码工具的讨论里,几乎所有开发者都默认了一个前提:必须选边站队。要么是 Claude Code 死忠,要么是 Cursor 铁粉,要么是 GP…...

BepInEx 6.0.0:Unity游戏模组开发的终极插件框架深度解析 [特殊字符]

BepInEx 6.0.0:Unity游戏模组开发的终极插件框架深度解析 🚀 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx(Bepis Injector Extensibl…...

CARLA与SUMO联合仿真踩坑实录:车辆速度获取不到?可能是ID映射搞的鬼

CARLA与SUMO联合仿真中的ID映射陷阱:从速度获取失败到系统协同设计 当你在深夜的实验室里盯着屏幕上静止的车辆数据时,那种挫败感我深有体会。CARLA和SUMO的联合仿真本应是智能交通系统研究的利器,却因为一个看似简单的车辆速度获取问题让整个…...

AgentNova R05.0:零依赖、本地优先的自主AI智能体框架深度解析

1. 项目概述:一个为本地运行而生的可扩展智能体框架 如果你和我一样,对市面上那些动辄需要联网、依赖复杂云服务、或者封装得像个黑盒子的AI智能体框架感到头疼,那么AgentNova R05.0的出现,可能会让你眼前一亮。这是一个处于Alph…...

游戏修改进阶:用CE修改器的代码注入功能,把‘扣血’变成‘加血’

游戏逆向实战:用CE代码注入实现"扣血变加血"的底层逻辑改造 在游戏修改的进阶领域,单纯修改数值地址已经无法满足高阶玩家的需求。当游戏采用动态地址、服务器校验或复杂的计算逻辑时,传统的内存扫描方法往往束手无策。这正是代码注…...