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

2023-05-16

题目:

  分析以下需求,并用代码实现 
        有一个抽奖池,该抽奖池中存放了奖励的金额,
        该抽奖池中的奖项为
        {"魅族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]) {
                        //可以取出数据,将状态改为true
                        flag[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没有抽到奖项,下次努力~");
                       }
                }

            }

        }
    }

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • iOS开发规范

    iOS代码编写规范 Git的使用 iOS进阶开发 目的 了利于项目维护以及规范开发 xff0c 促进成员之间Code Review的效率 xff0c 故提出以下开发规范 xff0c 如有更好的建议 xff0c 欢迎提出 qq 2807425
  • web登陆退出测试点总结

    根据自己的测试经历 xff0c 又阅读了一些关于登陆测试的资料 xff0c 对web 登陆退出测试点做了一下总结 xff1a 界面测试 xff1a 1 登陆页面显示是否正常 xff1a 文字和图片能否正常显示 xff0c 相应的提示信息是否
  • 人工智能会取代程序员吗?

    多亏了人工智能 xff08 AI xff09 xff0c 软件将在未来自行编写 至少 xff0c 这就是谷歌首席执行官桑达尔 皮查伊 xff08 Sundar Pichai xff09 对软件开发未来的看法 他是对的 xff01 这并不能使
  • 解决kotlin与databinding同时使用时 Unresolved reference问题(Unresolved reference RN)

    添加一下代码 xff1a 编译出现以下错误 需要添加一下代码 在app gradle中加入以下内容 xff0c 其中版本号 apply plugin 39 kotlin kapt 39 kapt generateStubs 61 true
  • QQ登录 110401:请求的应用不存在

    我出现的原因是在AndroidManifest里边没有把应用的名称改为与QQ开放平台上创建应用的名称相同
  • @Value和@Bean注解的执行顺序问题

    Springboot中使用 64 Configruation和 64 Bean一起将Bean注册到ioc容器中 xff0c 而 64 Value常用于将yml配置文件中的配置信息注入到类的成员变量中 当 64 Configruation 6
  • MTK平台 Sensor Hub配置(以stk3x3x光感为例)(Android 9.0)

    Sensor Hub 配置 alps mediateksample PROJECT ProjectConfig mk MTK SENSOR SUPPORT 61 yes 必须配置 MTK SENSOR HUB SUPPORT 61 yes
  • qemu-system-x86_64(1)-Linux手册页

    qemu system x86 64 名称概要描述选项printf 96 96 letmein 39 39 gt mypasswd txt qemu system x86 64 object secret id 61 sec0 file 6
  • 设置CMD窗口

    文章目录 1 图形界面设置1 1 打开CMD窗口1 2 点击属性设置 2 命令mode修改2 1 查看控制台信息2 2 修改控制台参数 3 注册表方式修改3 1 打开注册表3 2 修改参数 1 图形界面设置 1 1 打开CMD窗口 按下wi
  • 学习之旅——Android的onNewIntent()

    onNewIntent何时会被执行 xff1a 前提 xff1a 在该Activity的实例已经存在于Task和Back stack中 或者通俗的说可以通过按返回键返回到该Activity 时 当使用intent来再次启动该Activity
  • Getting Exception org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast to org.apache.logging.l

    把下面的依赖去掉即可 xff01 log4j to slf4j 2 0 2 jar log4j to slf4j 2 0 2 sources jar log4j slf4j impl 2 0 2 jar log4j slf4j impl 2
  • C# 条件编译 (#if 和 Conditional)

    本文转载自 xff1a C 条件编译 xff08 if 和 Conditional xff09 腾讯云开发者社区 腾讯云 本文主要讲述C 中 xff0c 使用 if 和 Conditional 特性来按条件编译代码的不同原理和适用场景 本文
  • 网络时延的几个概念

    假设一个数据包X从路由器A到路由器B xff0c 我们来分析下 xff0c 在这种情况下 xff0c 数据包X从A到B的总时延 xff1a 当A接收到数据包时 xff0c 会检测数据包的首部 xff0c 决定将该数据包导向哪一个链路上 xf
  • C#自动引用Debug | Release版本的dll

    1 其它模块的的dll路径 存放路径 解决方案 43 lib 文件夹下 xff0c Debug存放Debug文件 xff0c Release目录存放Release文件 2 其他项目中如何自动加载对应版本的dll文件 文本格式打开 cspro
  • Visual Studio 远程调试

    条件 xff1a 应用程序和本机调试机器需在同一局域网内 1 找vs里面的远程工具文件夹 xff0c 复制到目标电脑 2 然后点进去进行对应的位数 xff0c 找下图此文件 xff0c 右键管理员运行 xff0c 并设置选项 xff08 部
  • c#离线安装NuGet包

    1 前言 在开发c 程序时 xff0c 有时会用到第三方库 xff0c 可以在VS中从NuGet直接下载 xff0c 但是这是在开发环境联网的情况下 xff0c 如果开发环境处于无网络连接的时候 xff0c 那应该如何安装NuGet包呢 x
  • C#如何实现读写ini文件

    本文转载自 xff1a https www jb51 net article 235534 htm 一 c 读写Ini操作类 using System using System Collections Generic using Syste
  • C#Office.Interop.Excel.dll读写表格

    本文摘自 xff1a C Office Interop Excel dll读写表格 笨鸟未必先飞的博客 CSDN博客 c microsoft office interop excel 一 写入excel lt summary gt 创建一个
  • C#组件系列——又一款Excel处理神器Spire.XLS(二)

    阅读目录 一 基础入门 1 新建Workbook2 读写Workbook3 保存Workbook二 样式 1 文本样式2 单元格样式3 表格样式4 富文本编辑框三 冻结行列 1 冻结行2 冻结列四 合并单元格五 选项过滤功能六 下拉框七 显

随机推荐