Java基础-红包雨游戏-多线程

目录

案例要求:

实现思路:

代码:

Employee

RedPacket

RedPacketRain

总结:


案例要求:

实现思路:

创建一个员工类,id和抢到的金额,创建一个红包类,里面就是金额,创建一个抽奖操作类,设置10个线程进行抢红包操作

代码:

Employee

import lombok.AllArgsConstructor;public class Employee {private final int id;private int totalAmount; // 抢到的总金额private final Object lock = new Object(); // 用于同步的锁对象public Employee(int id) {this.id = id;this.totalAmount = 0;}// 线程安全的添加金额方法public void addAmount(int amount) {synchronized (lock) {totalAmount += amount;}}public int getId() {return id;}public int getTotalAmount() {synchronized (lock) {return totalAmount;}}
}

RedPacket

public class RedPacket {private final int amount; // 红包金额public RedPacket(int amount) {this.amount = amount;}public int getAmount() {return amount;}
}

RedPacketRain

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;public class RedPacketRain {// 红包列表(使用线程安全的CopyOnWriteArrayList)private static final List<RedPacket> redPackets = new CopyOnWriteArrayList<>();// 员工列表private static final List<Employee> employees = new ArrayList<>();public static void main(String[] args) throws InterruptedException {// 1. 初始化红包(200个)generateRedPackets();// 2. 初始化员工(100个)for (int i = 1; i <= 100; i++) {employees.add(new Employee(i));}// 3. 创建多个线程模拟抢红包int threadCount = 10; // 10个抢红包线程Thread[] threads = new Thread[threadCount];for (int i = 0; i < threadCount; i++) {threads[i] = new Thread(new GrabRedPacketTask(), "抢红包线程-" + (i + 1));}// 4. 启动所有线程long startTime = System.currentTimeMillis();for (Thread thread : threads) {thread.start();}// 5. 等待所有线程执行完毕for (Thread thread : threads) {thread.join();}long endTime = System.currentTimeMillis();System.out.println("\n===== 抢红包结束,耗时:" + (endTime - startTime) + "ms =====");// 6. 按总金额排序并展示结果employees.sort((e1, e2) -> Integer.compare(e2.getTotalAmount(), e1.getTotalAmount()));System.out.println("\n===== 抢红包结果(按金额降序) =====");for (Employee emp : employees) {System.out.println("员工" + emp.getId() + ":总金额 " + emp.getTotalAmount() + "元");}}// 生成红包(80%小红包1-30元,20%大红包31-100元)private static void generateRedPackets() {Random random = new Random();// 160个小红包for (int i = 0; i < 160; i++) {redPackets.add(new RedPacket(random.nextInt(30) + 1));}// 40个大红包for (int i = 0; i < 40; i++) {redPackets.add(new RedPacket(random.nextInt(70) + 31));}}// 抢红包任务static class GrabRedPacketTask implements Runnable {private final Random random = new Random();@Overridepublic void run() {// 循环抢红包,直到红包抢完while (!redPackets.isEmpty()) {// 随机获取一个红包(线程安全的移除)RedPacket packet = null;synchronized (redPackets) { // 保证红包列表操作的线程安全if (!redPackets.isEmpty()) {int index = random.nextInt(redPackets.size());packet = redPackets.remove(index);}}// 如果抢到红包,随机分配给一个员工if (packet != null) {int empIndex = random.nextInt(employees.size());Employee emp = employees.get(empIndex);emp.addAmount(packet.getAmount());// 打印抢红包信息(可选,过多会影响性能)// System.out.println(Thread.currentThread().getName() + ":员工" + emp.getId() + "抢到 " + packet.getAmount() + "元");}}}}
}

总结:

本文实现了一个多线程抢红包系统。系统包含三个核心类:Employee类(员工信息)、RedPacket类(红包金额)和RedPacketRain类(主程序)。通过10个线程模拟并发抢红包过程:初始化200个红包(80%为1-30元,20%为31-100元)和100个员工,使用CopyOnWriteArrayList保证线程安全,随机分配红包给员工。最终按员工抢到的总金额降序输出结果。关键点包括:使用同步锁保证金额累加安全,随机红包分配策略,以及线程间的并发控制。

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

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

相关文章

[激光原理与应用-203]:光学器件 - 增益晶体 - 增益晶体的使用方法

增益晶体是激光器的核心元件&#xff0c;其作用是通过受激辐射放大光信号。正确使用增益晶体需综合考虑晶体选型、光路设计、热管理、泵浦方式及安全防护等关键环节。以下是增益晶体的详细使用方法及注意事项&#xff1a;一、晶体选型&#xff1a;根据需求匹配参数材料选择Nd:Y…

​什么是抽象主义人工智能?​

什么是抽象主义人工智能&#xff1f; 传统的人工智能分为符号主义和连接主义两个派别&#xff0c;后来又增加了行为主义。 我发现符号主义和连接主义处理的都是文本&#xff0c;而不是语义。原来的专家系统是符号主义的产物。现在的大语言模型是连接主义的产物。它们处理的都…

OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具

下载地址获取点击这里打开&#xff1a;OpenSpeedy 简单介绍OpenSpeedy 是一款开源免费的游戏变速工具&#xff08;对某些网盘或者其他的一些下载也可进行加速&#xff09;&#xff0c;让你的游戏突破帧率限制&#xff0c;提供更流畅丝滑的游戏加速体验。1、完全免费且开源2、简…

Windows 电脑远程访问,ZeroTier 实现内网穿透完整指南(含原理讲解)

&#x1f9ed; 一、目标场景说明 想从安卓移动端远程到Windows电脑 实现如下效果&#xff1a; 家中 Windows 电脑开机联网&#xff1b;安卓手机/平板在外地&#xff0c;只要联网就能远程控制电脑桌面&#xff1b;不需要公网 IP&#xff0c;不用设置端口映射&#xff1b;免费…

解决本地连接服务器ollama的错误

1. 服务器 ollama 安装 $ curl -fsSL https://ollama.com/install.sh | sh >>> Cleaning up old version at /usr/local/lib/ollama >>> Installing ollama to /usr/local >>> Downloading Linux amd64 bundle ##################################…

详解Windows(十四)——PowerShell与命令提示符

详解Windows&#xff08;十四&#xff09;——PowerShell与命令提示符 一、Windows命令行工具概述 1. 什么是命令行界面(CLI) 命令行界面&#xff0c;简称CLI&#xff08;Command Line Interface&#xff09;&#xff0c;是一种通过输入文字命令来操作电脑的方式。与我们熟悉…

Spring源码解析 - SpringApplication 属性-初始化initializers, listeners -Spring提供的钩子函数

初始化源码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {~~~setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(A…

简单聊聊PowerShell

1、powershell和cmdpowershell简单来说也是一个控制终端&#xff0c;他也经常拿出来和windows自带的CMD来进行对比。windows系统一般来说这两者都是自带的。虽然cmd平时大家用的最多&#xff0c;但他是非常古老的&#xff0c;可以用来执行简单的批处理文件&#xff0c;如.bat等…

Spring系列之Spring AI入门

概述 GitHub&#xff0c;官网&#xff0c;目前最新版是1.0.1。 功能&#xff1a; 跨AI提供商的可移植API&#xff1a;用于聊天、文本到图像和嵌入模型。支持同步和流API选项。还支持下拉访问模型特定功能。跨Vector Store提供商的可移植API&#xff0c;包括同样可移植的新颖…

ELK常见的问题

ELK 栈在使用过程中会遇到各种问题&#xff0c;以下是常见问题分类及解决方案&#xff0c;涵盖 ​Elasticsearch、Logstash、Kibana 和 Beats&#xff08;如 Filebeat&#xff09;​​ 四大组件&#xff1a; &#x1f6a8; ​一、连接与通信问题​ 1. ​Elasticsearch 拒绝连接…

物理AI与人形机器人:从实验室到产业化的关键跨越

2025年8月9日&#xff0c;北京——世界机器人大会&#xff08;WRC&#xff09;的开幕成为物理AI与机器人技术发展的集中展示场。英伟达在大会预告中首次提出“物理AI将重塑50万亿美元市场”的论断&#xff0c;涵盖工业制造、医疗、低空经济等领域。与此同时&#xff0c;宇树科技…

使用 Vuepress + GitHub Pages 搭建项目文档(2)- 使用 GitHub Actions 工作流自动部署

在上一篇文章中&#xff0c;我们已经成功用 VuePress 搭建了项目文档&#xff0c;并使用 sh 脚本部署到了 GitHub Pages。 但随着文档的更新频率增加&#xff0c;每次都要手动推送&#xff0c;那有没有不需要手动推送的方法呢&#xff1f;那必须有。 这次我们将用 GitHub Actio…

Python爬虫实战:研究PSpider框架,构建电商数据采集和分析系统

一、引言 1.1 研究背景 在大数据时代,数据已成为驱动科技创新、商业决策和社会发展的核心资源。据 IDC 预测,全球数据量将从 2020 年的 64ZB 增长至 2025 年的 175ZB,其中互联网公开数据占比超过 60%。如何从海量网络信息中高效、精准地提取有价值的数据,成为学术界和工业…

剑指offer第2版:动态规划+记忆化搜索

前三题是同一种模型&#xff0c;所以我分别用递推、记忆化、动归来做 一、p74-JZ10 斐波那契数列 斐波那契数列_牛客题霸_牛客网 class Solution { public:int Fibonacci(int n) {// write code hereif(n1||n2) return 1;int a1,b1,c1;while(n>2){cab;ab;bc;--n;}return c…

Unity 调节 Rigidbody2D 响应速度的解决方案【资料】

可以通过多种方式调节 Unity 中 Rigidbody2D 的响应速度&#xff0c;包括降低物理更新频率、屏蔽过小值以及优化物理参数。以下是几种有效的实现方法&#xff1a;1. 降低物理更新频率&#xff08;不推荐直接修改&#xff09;虽然可以修改 Time.fixedDeltaTime 来降低物理更新频…

力扣-189.轮转数组

题目链接 189.轮转数组 class Solution {public void reverse(int[] nums, int i, int j) {while (i < j && i > 0 && j < nums.length) {int temp nums[i];nums[i] nums[j];nums[j] temp;i;j--;}}public void rotate(int[] nums, int k) {k k …

Linux命令行安装Climate Data Operators(CDO)的方法

本文介绍在Linux操作系统的发行版本Ubuntu中&#xff0c;基于命令行&#xff0c;配置Climate Data Operators&#xff08;CDO&#xff09;这个用于操作、分析气候及其他相关数据的命令行工具的方法。 最近&#xff0c;需要对一批.nc格式文件加以处理&#xff1b;在之前&#xf…

如何为您的服务器选择正确的 PHP 版本

PHP作为最流行的服务器端脚本语言之一&#xff0c;持续演进并定期发布新版本。为您的服务器选择正确的PHP版本对于网站性能、安全性和功能兼容性至关重要。本文将指导您如何做出明智的选择。了解PHP版本的生命周期在选择PHP版本前&#xff0c;首先需要了解PHP的版本支持政策&am…

从0开始的中后台管理系统-5(userList动态展示以及上传图片和弹出创建用户表单)

项目用的都是antd组件&#xff0c;这里的userList组件展示的表单组件的数据直接get请求拿过来展示的&#xff0c;这里随机生成了50个用户只是为了展示表单的api设置。首先就是表单展示需要两个参数current和pageSize两个属性控制表单的最大分页和当前页面。那么我们就设置初始值…

Spring MVC REST API设计详解:从零构建高效接口

1. Spring MVC与REST API基础1.1 RESTful架构的六大约束详解RESTful架构是Roy Thomas Fielding在2000年博士论文中提出的软件架构风格&#xff0c;它包含六个核心约束&#xff0c;这些约束共同构成了RESTful API的设计原则。客户端-服务器约束&#xff08;Client-Server&#x…