Java——关于实现多线程的测试小题,帮助我们更好的理解多线程的使用方法

2023-12-19

前面讲解了关于多线程的使用方法,这篇文章则是进行实战,做几道测试题。

感兴趣的情况下可以看一下 Java多线程

多线程练习1 (卖电影票)


一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒要求:请用多线程模拟卖票过程并打印剩余电影票的数量

线程代码:

package Exercise.Exam1;

public class Mythread extends Thread{
    static int count = 1;

    @Override
    public void run() {
        while (true){
            synchronized (Mythread.class){
                if (count<=1000){
                    try {
                        Thread.sleep(3000);

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName()+"正在卖第"+count+"张票");
                    count++;
                }else
                    break;
            }
        }
    }
}

测试类:

package Exercise.Exam1;

public class Test {
    public static void main(String[] args) {
        Mythread mythread1 = new Mythread();
        Mythread mythread2 = new Mythread();

        mythread1.setName("窗口一");
        mythread2.setName("窗口二");

        mythread1.start();
        mythread2.start();
    }
}

运行结果:

多线程练习2 (送礼品)


有100份礼品,两人同时发送,当剩下的礼品小于10份的时候则不再送出。
利用多线程模拟该过程并将线程的名字和礼物的剩余数量打印出来.

线程代码:

package Exercise.Exam2;

public class MyThread extends Thread{
    public MyThread(String name) {
        super(name);
    }
    static int count =1;
    @Override
    public void run() {
        while (true) {
            synchronized (MyThread.class){
                if(count==91){
                    break;
                }
                else {

                    System.out.println(getName()+"送出的第"+count+"份礼物");
                    int sum = 100-count;
                    System.out.println("礼物还剩下" +sum +"份礼物");
                    count++;
                    if (sum==10){
                        System.out.println("最后的十份礼物");
                    }
                }
            }
        }
    }
}

测试类:

package Exercise.Exam2;

public class Test {
    public static void main(String[] args) {
        MyThread thread = new MyThread("马");
        MyThread thread1 = new MyThread("安");

        thread.start();
        thread1.start();

    }
}

运行结果:

多线程练习3 (打印奇数数字)


同时开启两个线程,共同获取1-100之间的所有数字要求:将输出所有的奇数。

线程代码

package Exercise.Exam3;

public class Mythread extends Thread{
    private static Object object  = new Object();
    static int num =1;
    @Override
    public void run() {
        while (true){
            synchronized (object){
                object.notifyAll();
                if (num<=100){
                    int ji = num%2;
                    if (ji!=0){
                        System.out.println(num);

                    }
                    num++;
                }else
                    break;
            }
        }
    }

}

测试类

package Exercise.Exam3;

public class Test {
    public static void main(String[] args) {

        Mythread mythread = new Mythread();
        Mythread mythread2 = new Mythread();

        mythread.start();
        mythread2.start();
    }
}

运行结果

多线程练习4(抢红包)


抢红包也用到了多线程。
假设:100块,分成了3个包,现在有5个人去抢
其中,红包是共享数据。
5个人是5条线程。
打印结果如下:
XXX抢到了XXX元
XXX抢到了XXX元
XXX抢到了XXX元
XXX没抢到
XXX没抢到

线程代码:

package Exercise.Exam4;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Mythread implements Runnable {
    static double sum = 100.00;
    static double num = 0.00;
    static int count = 1;
    @Override
    public void run() {
        while (true){
            synchronized (Mythread.class){
                if(count<3) {
                    double random = Math.random() * sum;
                    BigDecimal a = new BigDecimal(random);
                    BigDecimal bigDecimal = a.setScale(2, RoundingMode.FLOOR);
                    double money = bigDecimal.doubleValue();
                    System.out.println(Thread.currentThread().getName() + "获得了" + money + "元");
                    num = num+money;
                    sum = 100.00-num;
                }
                else if(count==3){
                    double m = 100.00;
                    double three = m-num;
                    BigDecimal a = new BigDecimal(three);
                    BigDecimal bigDecimal = a.setScale(2, RoundingMode.FLOOR);
                    System.out.println(Thread.currentThread().getName()+"获得了" + bigDecimal + "元");
                }
                else if (count>=4&&count<=5) {
                    System.out.println(Thread.currentThread().getName()+"抱歉,您没有抢到红包");
                }
                else {
                    break;
                }

                count++;
                Thread.currentThread().interrupt();
                break;

            }
        }
    }
}

测试类:

package Exercise.Exam4;


public class Testr {
    public static void main(String[] args)  {
        Mythread mythread = new Mythread();
        Thread thread1 = new Thread(mythread);
        Thread thread2 = new Thread(mythread);
        Thread thread3 = new Thread(mythread);
        Thread thread4 = new Thread(mythread);
        Thread thread5 = new Thread(mythread);

        thread1.setName("马");
        thread2.setName("安");
        thread3.setName("安");
        thread4.setName("好");
        thread5.setName("帅");

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();

    }
}

运行结果:

多线程练习5 (抽奖箱抽奖)
有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为(10,5,20350,100,200,500,800,2,80,300,700;创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”“抽奖箱2"随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
每次抽出一个奖项就打印一个(随机)抽奖箱1 又产生了一个10 元大奖
抽奖箱1又产生了一个100 元大奖
抽奖箱1 又产生了一个200 元大奖
抽奖箱1又产生了一个800 元大奖抽奖箱2又产生了一个 700 元大奖

线程代码:

package Exercise.Exam5;


import java.util.ArrayList;
import java.util.Collections;

public class Mythread implements Runnable {
    ArrayList<Integer> list;

    public Mythread(ArrayList list) {
        this.list = list;
    }
    @Override
    public void run() {
        while (true){
            synchronized (Mythread.class){
                if (list.size() ==0){
                    System.out.println("奖项已经被抽完了>>>>>");
                    break;
                }
                else{
                    Collections.shuffle(list);
                    int prize = list.remove(0);
                    System.out.println(Thread.currentThread().getName()+"出了"+prize+"元大奖");
                }
            }
        }
    }
}

多线程练习6 (多线程统计并求最大值)
在上一题基础上继续完成如下需求
每次抽的过程中,不打印,抽完时一次性打印(随机)在此次抽奖过程中,抽奖箱1总共产生了6个奖项
分别为: 10,20,100,500,2,300最高奖项为300元,总计额为932元在此次抽奖过程中,抽奖箱2总共产生了6个奖项。
分别为:5,50,200,800,80,700最高奖项为800元,总计额为1835元

多线程练习7(多线程之间的比较)
在上一题基础上继续完成如下需求:
在此次抽奖过程中,抽奖箱1总共产生了6个奖项,分别为:10,20,100,500,2,300
最高奖项为300元,总计额为932元在此次抽奖过程中,抽奖箱2总共产生了6个奖项,分别为:5,50,200,800,80,700最高奖项为800元,总计额为1835元在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为800元
以上打印效果只是数据模拟,实际代码运行的效果会有差异

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

Java——关于实现多线程的测试小题,帮助我们更好的理解多线程的使用方法 的相关文章

  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr

随机推荐

  • IDEA--properties配置文件中文乱码处理

    在setting配置中进行配置
  • 解读 | VR体验式教育的优势 让教育触手可及

    大家好 我是极智视界 欢迎关注我的公众号 获取我的更多前沿科技分享 邀您加入我的知识星球 极智视界 星球内有超多好玩的项目实战源码和资源下载 链接 https t zsxq com 0aiNxERDq 很多孩子过多地沉浸在所谓的 传统教育
  • 极智AI | 算子融合、矩阵分块 一图看懂大模型优化技术FlashAttention

    欢迎关注我的公众号 极智视界 获取我的更多经验分享 大家好 我是极智视界 本文来介绍一下 算子融合 矩阵分块 一图看懂大模型优化技术FlashAttention 邀您加入我的知识星球 极智视界 星球内有超多好玩的项目实战源码下载 链接 ht
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • WIN10安装gurobi给matlab使用(记录)

    https www gurobi com downloads gurobi software 这是以前的matlab路径 需要修改成新的 使用校园网激活一下 运行gurobi setup Google报错信息 发现mathwork官方的解释
  • C++内存布局

    温故而知新 本文浅聊和回顾下C 内存布局的知识 一 c 内存布局 C 的内存布局主要包括以下几个部分 代码段 存储程序的机器代码 数据段 存储全局变量和静态变量 数据段又分为初始化数据段 存储初始化的全局变量和静态变量 和未初始化数据段 存
  • ITIL流程是什么?理解和应用IT服务管理最重要的框架

    IT服务管理 IT Service Management 简称ITSM 是指通过采用一系列的最佳实践和方法论来规划 设计 交付和支持信息技术服务 以满足组织和用户的需求 而ITIL Information Technology Infras
  • ubuntu部署llama2-chinese

    ubuntu上安装cuda见之前的blog 已安装cuda12 使用nvcc V 下载llama2 chinese GitHub FlagAlpha Llama2 Chinese Llama中文社区 最好的中文Llama大模型 完全开源可商
  • 【雕爷学编程】Arduino智慧农业之养殖水质监测与控制

    Arduino是一个开放源码的电子原型平台 它可以让你用简单的硬件和软件来创建各种互动的项目 Arduino的核心是一个微控制器板 它可以通过一系列的引脚来连接各种传感器 执行器 显示器等外部设备 Arduino的编程是基于C C 语言的
  • 【神器】wakatime代码时间追踪工具

    文章目录 wakatime简介 支持的IDE 安装步骤 API文档 插件费用 写在最后 wakatime简介 wakatime就是一个IDE插件 一个代码时间追踪工具 可自动获取码编码时长和度量指标 以产
  • Kyligence 发布数据和分析领域垂直大模型司南(Compass)

    12 月 19 日 跬智信息 Kyligence 正式发布 数据和分析领域垂直大模型司南 Compass 以下简称 司南大模型 基于多年数据和分析领域的实践积累和全行业指标洞察的海量语料 Kyligence 司南大模型已具备 自然语言对话分
  • ssm+mysql应急指挥平台-计算机毕业设计源码13263

    摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的历史正进入一个新时代 在现实运用中 应用软件的工作规则和开发步
  • 制造业CRM选型注意事项:有这些功能的系统更好用

    当前 推动制造业数字化转型已成时代发展趋势 为了适应这一趋势 制造业使用 CRM管理系统 是非常 重要的 那么 制造业CRM应该怎么选 1 全方位客户管理 订单价值大 交货周期长 客户开发难 这一直是制造业的痛点 前二点是由于行业特性 第三
  • 物流运输CRM:让日常工作有条不紊

    很多物流行业的企业主都有这样的烦恼 客户来自各行各业 很难细分管理 业务量大庞大 工作很难细化 客户满意度低 缺乏售后跟踪 如果您也面临相同的问题 那么该让CRM管理系统 登场啦 下面说说 物流运输行业 CRM系统有什么作用 1 客户分类管
  • CRM系统在IT软件行业的重要性和价值 | 发展趋势和选择理由

    如今 IT软件行业面临诸多问题 如推广成本的增加和交易周期的延长 很多销售人员埋怨产品好 有需求 但最终没有做到买卖的流程 为了改善这种业务问题 CRM管理系统是一个不错的选择 那样 IT软件行业CRM系统的好处是什么呢 IT软件行业面临哪
  • 金融CRM有用吗?金融行业CRM有哪些功能

    市场形式波诡云谲 金融行业也面临着资源体系分散 竞争力后继不足 未知风险无法规避等问题 金融企业该如何解决这些问题 或许可以了解一下CRM管理系统 和其提供的 金融行业CRM解决方案 金融行业是银行业 保险业 信托业 证券业和租赁业的总称
  • 普通USB摄像头转为网络摄像头

    普通USB摄像头转为网络摄像头 2022 02 25 Raspberry Pi Zero W吃灰有一段时间了 想着能否废物利用 使用普通USB摄像头改成一个RTSP协议网络摄像头 1 查看摄像头是否可用 查看是否已识别USB摄像头 lsus
  • 井盖位移传感器作用一览,井盖出现位移如何预警

    在城市的公共马路 小区住宅或工厂区路面上随处可见各种各样的井盖 不仅材质不一 而且每一个井盖背后的存在意义也是不同的 但是这些井盖有一个共同的特点 便是地上地下城市生命线的关键连接点 无论哪一种类型的井盖出现问题 即便是轻微的位移或者翻转
  • 解决Electron应用中的白屏问题的实用方法

    在使用Electron构建应用程序时 一些开发者可能会面临窗口加载过程中出现的白屏问题 这种问题主要分为两个方面 Electron未加载完毕HTML 这时Electron自身产生的白色背景可能导致用户在启动应用时看到一片空白 HTML加载渲
  • Java——关于实现多线程的测试小题,帮助我们更好的理解多线程的使用方法

    前面讲解了关于多线程的使用方法 这篇文章则是进行实战 做几道测试题 感兴趣的情况下可以看一下 Java多线程 多线程练习1 卖电影票 一共有1000张电影票 可以在两个窗口领取 假设每次领取的时间为3000毫秒要求 请用多线程模拟卖票过程并