一道多线程编程题的代码案例(两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,)

news/2025/1/12 1:59:14/

题目:

  分析以下需求,并用代码实现 
        有一个抽奖池,该抽奖池中存放了奖励的金额,
        该抽奖池中的奖项为
        {"魅族E","畅玩6X","坚果Pro","小米Note2","iphone 7Plus",
          "一加手机 5","三星 Galaxy S6","华为p10 Plus","OPPO A77",
          "华为荣耀 V9","努比亚 Z17","Moto Z Play"}; 
          
          
       创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,
       随机从抽奖池中获取奖项元素并打印在控制台上,格式如下: 
       
       2.每次抽的过程中,不打印,抽完时一次性打印(不要求交替抽奖,每个奖项只能被抽取一次),打印格式如下(以下是三次随机运行的效果): 
       第一次运行效果: 
       在此次抽奖过程中,抽奖箱2总共产生了6个奖项,分别为:[华为p10 Plus,iphone 7Plus,魅族E,小米Note2,OPPO A77,华为荣耀 V9] 
       在此次抽奖过程中,抽奖箱1总共产生了6个奖项,分别为:[三星 Galaxy S6,坚果Pro,一加手机 5,努比亚 Z17,Moto Z Play,畅玩6X] 
  
       第二次运行的效果: 
       在此次抽奖过程中,抽奖箱1总共产生了12个奖项,分别为:[OPPO A77,魅族E,努比亚 Z17,Moto Z Play,畅玩6X,坚果Pro,华为p10 Plus,一加手机 5,iphone 7Plus,小米Note2,三星 Galaxy S6,华为荣耀 V9] 
       在此次抽奖过程中,抽奖箱2没有抽到奖项,下次努力~ 
  
       第三次运行的效果: 
       在此次抽奖过程中,抽奖箱1总共产生了7个奖项,分别为:[OPPO A77,小米Note2,iphone 7Plus,三星 Galaxy S6,华为荣耀 V9,华为p10 Plus,坚果Pro] 
       在此次抽奖过程中,抽奖箱2总共产生了5个奖项,分别为:[魅族E,一加手机 5,Moto Z Play,努比亚 Z17,畅玩6X] 
  
注意: 
       1.每个奖项只能被抽取1次 
       2.抽完后一次性打印,而不是抽一次打印一次 
       3.如果一个奖项都没抽到,打印格式如下: 
              在此次抽奖过程中,抽奖箱x没有抽到奖项,下次努力~(x表示1或者2)


实现代码如下: 

package com.abc.test;
import java.util.*;public class ThreadTest {public static void main(String[] args) {Chou c = new Chou();new Thread(() -> c.show(),"抽奖箱1").start();new Thread(() -> c.show(),"抽奖箱2").start();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}c.printResult();}
}class Chou{String[] arr = new String[]{"魅族E","畅玩6X","坚果Pro","小米Note2","iphone 7Plus","一加手机 5","三星 Galaxy S6","华为p10 Plus","OPPO A77","华为荣耀 V9","努比亚 Z17","Moto Z Play"};//获取数组长度为循环取数据的次数int num = arr.length;//创建一个用来标识数据是否被取出过的状态boolean[] flag = new boolean[arr.length];boolean temp = true;Map<String,String> map = new HashMap<>();public void show() {//循环数组的长度while(temp) {synchronized (this) {//判断取数据的次数,当num<=0时,说明数据全部取出了if (num > 0) {//取出随机的一个数据,获取索引0~num的值int index = (int) (Math.random() * arr.length);//判断索引为index的数据的状态,如果为false表示没有取出过,可以取出数据if (!flag[index]) {//可以取出数据,将状态改为trueflag[index] = true;//   提示信息//   System.out.println(Thread.currentThread().getName() + "产生了" + arr[index] + "元大奖");//   取一次数据,num--,减少一次取数据的次数map.put(arr[index],Thread.currentThread().getName());num--;//休眠,看效果try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}} else {temp = false;}}}}public void printResult(){Map<String,Object[]> map2 = new HashMap<>();Set<Map.Entry<String, String>> entries = map.entrySet();for (Map.Entry<String,String> entry : entries){if(map2.containsKey(entry.getValue())){Object[] strings = map2.get(entry.getValue());List<Object> strings2 = Arrays.asList(strings);List<Object> strings1 = new ArrayList<>();strings1.addAll(strings2);strings1.add(entry.getKey());Object[] s =  strings1.toArray();map2.put(entry.getValue(), s);}else{map2.put(entry.getValue(),new Object[]{entry.getKey()});}}Set<Map.Entry<String, Object[]>> entries1 = map2.entrySet();for(Map.Entry<String,Object[]> entry : entries1){System.out.println("在此次抽奖过程中," + entry.getKey() +  "共产生了" + entry.getValue().length + "奖项,分别为:" + Arrays.toString(entry.getValue()));if(map2.size() <= 1){if("抽奖箱1".equals(entry.getKey())){System.out.println("在此次抽奖过程中,抽奖箱2没有抽到奖项,下次努力~");}else{System.out.println("在此次抽奖过程中,抽奖箱1没有抽到奖项,下次努力~");}}}}}

欢迎大家进行优化, 有些代码感觉写的比较惆怅~


http://www.ppmy.cn/news/228892.html

相关文章

gcc -O3优化

/* * O3 的描述如下&#xff1a; */ -O3 完美包含 -O2 的全部优化选项&#xff0c;还有额外的优化。 -fgcse-after-reload 如果启用了-fgcse after reload&#xff0c;则会在重新加载后执行冗余负载消除过程。此通行证的目的是清理多余的溢出物。 由-O3、…

云原生周刊:开发人员使用 GPT-4 的 30 种重要方法 | 2023-6-5

OpenAI 最新的大型语言模型 GPT-4 有非常多的用途&#xff0c;那么&#xff0c;作为开发人员&#xff0c;应该如何去使用它&#xff0c;来帮助自己工作呢&#xff1f; 在最近的 Hacker News 问答中&#xff0c;很多开发人员参与了讨论和分享。 也有人进行了汇总&#xff0c;梳…

Docker容器的基本使用

Docker容器的基本使用 一、Docker容器介绍二、检查本地Docker环境1. 检查Docker版本2. 检查Docker服务状态三、创建一个测试web01容器1. 检查本地容器镜像2. 下载nginx镜像3. 创建一个测试容器四、查看测试容器web01的状态1. 查看容器运行状态2. 检查容器的运行日志3. 查看容器…

【备战秋招】每日一题:4月8日美团春招(三批)第一题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

比较99^100,100^99大小

方法一&#xff1a;设函数—>求导—>积分 方法二&#xff1a;使用二项式定理&#xff08;未总结&#xff09; ### 来自亮仔的搬运工 ###

c语言99乘法表

编写一程序实现以下功能 从键盘输入1&#xff5e;9之间的一个数&#xff0c;根据输入的数&#xff0c;输出对应的下三角乘法口诀表。 #include <stdio.h>int main() {int i, j, n;i 1;j 1;scanf("%d", &n);while(i < n){while(j < i){printf(&qu…

久久一

面向对象与非面向对象之间变量及方法的区分和理解&#xff1a;有人说面向对象的属性可以称为变量&#xff0c;而我认为这种说法一点不严格&#xff01;而且不准确&#xff01;因为面向对象的属性&#xff0c;是类所具备的行为特征&#xff0c;但所以可叫做成员变量&#xff0c;…

99乘法表

99乘法表 实现思路&#xff1a;使用一个循环控制打印9 行&#xff0c;在该循环的循环体中输出该行的内容&#xff0c;一行中输出的个数等于行号&#xff0c;值等于行号和列号的乘积。 package qq;public class qq {public static void main(String[] args) {// TODO Auto-gen…