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
英文地址,請注明出處:http://en.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…