多线程猜数问题

题目:线程 A 生成随机数,另外两个线程来猜数,线程 A 可以告诉猜的结果是大还是小,两个线程都猜对后,游戏结束,编写代码完成。

一、Semaphore

多个线程可以同时操作同一信号量,由此实现线程同步。

public class Main {private static Semaphore s1 = new Semaphore(0);private static Semaphore s2 = new Semaphore(0);// 待判断的线程private static Queue<Semaphore> judgeQueue = new LinkedList<>();// 保存线程猜的数private static Map<Semaphore, Integer> guessMap = new ConcurrentHashMap<>();// 保存判断结果private static Map<Semaphore, Integer> resMap = new ConcurrentHashMap<>();// 保存猜数线程二分过程中的左右边界private static Map<Semaphore, Pair<Integer, Integer>> edgeMap = new ConcurrentHashMap<>();private static Set<Semaphore> set = new HashSet<>();public static void main(String[] args) {new Thread(Main::judge, "判断线程").start();new Thread(() -> guess(s1), "猜线程1").start();new Thread(() -> guess(s2), "猜线程2").start();}private static void judge() {System.out.println("开始猜数!");int num = ThreadLocalRandom.current().nextInt(100);System.out.printf("要猜的数是 %d\n", num);set.add(s1);set.add(s2);s1.release();s2.release();while (true) {while (!judgeQueue.isEmpty()) {Semaphore s = judgeQueue.poll();Integer guessNum = guessMap.get(s);if (guessNum != null) {if (guessNum > num) {resMap.put(s, 1);} else if (guessNum < num) {resMap.put(s, 2);} else {resMap.put(s, 0);}s.release();} else {}}if (set.isEmpty()) {System.out.println("所有线程猜数完成!\n");break;}}}private static void guess(Semaphore s) {Pair<Integer, Integer> edge = new Pair<>(0, 100);edgeMap.put(s, edge);int guess = 0;while (true) {try {s.acquire();guess = guessNum(guess, s);if (guess != -1) {guessMap.put(s, guess);judgeQueue.add(s);} else {System.out.printf("%s 猜数成功!\n", Thread.currentThread().getName());set.remove(s);break;}} catch (InterruptedException e) {throw new RuntimeException(e);}}}private static int guessNum(int guess, Semaphore s) {Pair<Integer, Integer> pair = edgeMap.get(s);if (resMap.containsKey(s)) {int res = resMap.get(s);// 1 表示猜大了if (res == 1) {edgeMap.put(s, new Pair<>(pair.getKey(), guess - 1));} else if (res == 2) {edgeMap.put(s, new Pair<>(guess + 1, pair.getValue()));} else {// 猜中了return -1;}guess = (pair.getKey() + pair.getValue()) / 2;} else {guess = ThreadLocalRandom.current().nextInt(100);}System.out.printf("%s 猜的数是:%s\n", Thread.currentThread().getName(), guess);return guess;}
}

暂时没想到更好的解法,也欢迎大家指教。

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

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

相关文章

seq2seq

理解 transformer 中的 encoder decoder 详细的 transformer 教程见&#xff1a;【极速版 – 大模型入门到进阶】Transformer 文章目录 &#x1f30a; Encoder: 给一排向量输出另外一排向量&#x1f30a; Encoder vs. Decoder: multi-head attention vs. masked multi-head at…

Proxmox pct 部署ubuntu

pct 前言 PCT(Proxmox Container Tool)是 PVE 中用于管理 Linux 容器(LXC)的命令行工具。通过 PCT,用户可以执行各种容器管理任务,例如创建新的容器、启动和停止容器、更新容器、安装软件包、导出和导入容器等。PCT 提供了与 Web 界面相同的功能,但通过命令行进行操作,…

Google Play关键字优化:关键排名因素与实战策略

如果您准备发布应用程序或开始专注于关键字优化&#xff0c;您可能想知道如何向Google Play上的应用程序添加关键字。Google Play上的搜索量和排名与App Store不同&#xff0c;而且被索引排名的关键字也不同。在此文中&#xff0c;我们将确定Google Play上的关键排名因素&#…

Kafka延迟队列实现分级重试

技术方案 方案背景 Kafka队列消息消费处理过程中&#xff0c;发生处理异常&#xff0c;需要实现重试机制&#xff0c;并基于重试次数实现不同延迟时间重试方案。 方案介绍 通过实现Kafka延迟队列来实现消息重试机制。 目标&#xff1a; 支持所有业务场景的延迟重试支持多…

Maven核心配置文件深度解析:pom.xml完全指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、全栈领域优质创作者、高级开发工程师、高级信息系统项目管理师、系统架构师&#xff0c;数学与应用数学专业&#xff0c;10年以上多种混合语言开发经验&#xff0c;从事DICOM医学影像开发领域多年&#xff0c;熟悉DICOM协议及…

MSTP多域生成树

协议信息 MSTP 兼容 STP 和 RSTP&#xff0c;既可以快速收敛&#xff0c;又提供了数据转发的多个冗余路径&#xff0c;在数据转发过程中实现 VLAN 数据的负载均衡。 MSTP 可以将一个或多个 VLAN 映射到一个 Instance&#xff08;实例&#xff09;&#xff08;一个或多个 VLAN…

MQTT 服务器(emqx)搭建及使用(一)

一. EMQX 服务器搭建 1.下载EMQX 下载链接&#xff1a;Windows | EMQX 文档 官方手册 2.下载内容解压至盘符根目录 3.进入bin文件夹&#xff0c;在地址栏输入cmd 4.依次输入下面命令安装服务 .\emqx.cmd install .\emqx.cmd console 5.设置自启动 创建批处理文件&#x…

在Thinkphp中使用JWT 包括JWT是什么,JWT的优势

首先了解一下什么是JWT JWT 是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间以 JSON 对象形式安全传输信息4。其核心特点包括&#xff1a; 结构&#xff1a;由三部分组成&#xff08;Header、Payload、Signature&#xff09;&#xff0c;通过点号…

hackmyvn-casino

arp-scan -l nmap -sS -v 192.168.255.205 目录扫描 dirsearch -u http://192.168.255.205/ -e * gobuster dir -u http://192.168.255.205 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php -b 301,401,403,404 80端口 随便注册一个账号 玩游戏时的…

图表配置表增加分析指标字段

在设计报表图表配置表时&#xff0c;为存储 同比、环比 这类分析指标&#xff0c;建议通过以下方式定义字段结构和命名&#xff1a; 一、字段设计方案 // 配置表示例结构 interface ChartConfig {id: string; // 唯一标识name: string; // 图表…

广州SMT贴片加工厂精密制造工艺解析

内容概要 在电子制造领域&#xff0c;SMT贴片加工技术已成为现代电子产品精密组装的核心环节。广州作为华南地区电子产业的重要枢纽&#xff0c;其SMT贴片加工厂通过融合自动化设备与严格工艺标准&#xff0c;构建起高效可靠的制造体系。 对于电子产品制造商而言&#xff0c;…

RK3568-适配ov5647摄像头

硬件原理图 CAM_GPIO是摄像头电源控制引脚,连接芯片GPIO4_C2 CAM_LEDON是摄像头led灯控制引脚,连接芯片GPIO4_C3编写设备树 / {ext_cam_clk: external-camera-clock {compatible = "fixed-clock";clock-frequency = <25000000>;clock-output-names = "…

关于 @Autowired 和 @Value 使用 private 字段的警告问题分析与解决方案

问题背景 在使用 Spring 框架进行开发时&#xff0c;我们经常会使用 Autowired 和 Value 注解来进行依赖注入和属性值注入。然而&#xff0c;当我们将这些注解应用于 private 字段时&#xff0c;IDE&#xff08;如 IntelliJ IDEA&#xff09;可能会显示警告信息&#xff0c;提…

Flutter 开发环境配置--宇宙级教学!

目录 一、安装环境&#xff08;Windows&#xff09;二、Android 创建Flutter项目三、VSCode 搭建环境四、补充 一、安装环境&#xff08;Windows&#xff09; Flutter SDK 下载 推荐使用中国镜像站点下载 Flutter SDK&#xff0c;速度更快&#xff1a;中国环境 或者从官网下载…

碰一碰发视频网页版本开发的源码搭建指南

引言 在数字化信息快速传播的时代&#xff0c;近场通信&#xff08;NFC&#xff09;技术为信息交互带来了新的便捷方式。通过网页版本实现碰一碰发视频功能&#xff0c;能够让用户在浏览器环境中轻松实现视频分享&#xff0c;拓展了视频传播的途径。本文将详细介绍碰一碰发视频…

OMNIWeb 数据介绍

网址&#xff1a;SPDF - OMNIWeb Service 注&#xff1a;OMNI并非特定缩写&#xff0c;仅表示"多样化"含义。 About the Data All the data to which this interface and its multiple underlying interfaces provide access have in common that they are relevan…

Python学习(二)操作列表

一、列表的遍历 每个缩进的代码行都是循环的一部分&#xff0c;且将针对列表中的每个值都执行一次。因此&#xff0c;可对列表中的每个值执行任意次数的操作。 magicians [alice, david, carolina] for magician in magicians:print(magician)注意&#xff1a; 1、遍历的时…

浅析RAG技术:大语言模型的知识增强之道

浅析RAG技术&#xff1a;大语言模型的知识增强之道 &#x1f3e0; 引言&#xff1a;当生成遇到检索 在人工智能领域&#xff0c;大型语言模型(LLMs)如GPT-4、Llama3等展现出了惊人的文本生成能力&#xff0c;但它们也面临着知识滞后、事实性错误等挑战。Retrieval-Augmented …

Linux Vim 编辑器的使用

Vim 编辑器的使用 一、安装及介绍二、基础操作三、高级功能四、配置与插件 一、安装及介绍 Vim是一款强大且高度可定制的文本编辑器&#xff0c;相当于 Windows 中的记事本。具备命令、插入、底行等多种模式。它可通过简单的键盘命令实现高效的文本编辑、查找替换、分屏操作等…

Windows 图形显示驱动开发-WDDM 2.4功能-基于 IOMMU 的 GPU 隔离(三)

帧缓冲区保留 对于必须在电源转换期间将帧缓冲区的保留部分保存到系统内存的驱动程序&#xff0c;Dxgkrnl 会在适配器初始化时对所需内存进行用量认可。 如果驱动程序报告 IOMMU 隔离支持&#xff0c;则 Dxgkrnl 将在查询物理适配器上限后立即调用 DXGKDDI_QUERYADAPTERINFO&a…