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

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

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

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


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

线程代码:

package Exercise.Exam1;public class Mythread extends Thread{static int count = 1;@Overridepublic 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++;}elsebreak;}}}
}

测试类:

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;@Overridepublic 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;@Overridepublic void run() {while (true){synchronized (object){object.notifyAll();if (num<=100){int ji = num%2;if (ji!=0){System.out.println(num);}num++;}elsebreak;}}}}

测试类

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;@Overridepublic 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;}@Overridepublic 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元
以上打印效果只是数据模拟,实际代码运行的效果会有差异

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

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

相关文章

你应该知道的C语言Cache命中率提升法

C语言因其对内存的精细控制和高执行效率而在业界长盛不衰。但是&#xff0c;同样的语言不同的用法导致写出的代码执行效率可能会有很大差异&#xff08;数量级上的差异&#xff09;。 今天码哥给大家演示一种因cache命中率导致的效率差异示例。场景非常简单&#xff0c;就是单…

数据分析基础之《numpy(4)—ndarry运算》

一、逻辑运算 当我们要操作符合某一条件的数据时&#xff0c;需要用到逻辑运算 1、运算符 满足条件返回true&#xff0c;不满足条件返回false # 重新生成8只股票10个交易日的涨跌幅数据 stock_change np.random.normal(loc0, scale1, size(8, 10))# 获取前5行前5列的数据 s…

大模型评估中Pass@k值是如何计算的

在前面的博客中分别介绍了大模型评估过程不同指标的含义&#xff0c;以及如何通过代码&#xff0c;实现指标的收集。如果对如何运行代码生成结果和收集passk指标不清楚&#xff0c;可以参考这两篇博客。 如何对大模型进行评估上 如何对大模型进行评估下 Passk的来源 代码的生…

Elasticsearch 向量相似搜索

Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)来表示文档,并通过余弦相似性度量来计算文档之间的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文档: 文档的文本内容经过嵌入模型(如BERT、Word2Vec等)处理,得到一个密集向量(den…

【Spring】12 EmbeddedValueResolverAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架提供了许多回调接口&#xff0c;以便开发者在 Bean 的生命周期中执行一些特定操作。其中之一是 EmbeddedValueResolverAware 接口&#xff0c;本文将深入探…

单片机LCD1602

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、LCD1602是什么&#xff1f;二、LCD1602 原理三、显示一个字符四、如何显示四位数五、参考历程六、封装成一个显示 字符和一个显示任意四位数的函数总结 前言…

基于ssm防疫信息登记系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本防疫信息登记系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

回溯算法之棋盘问题hard

12.18 51N皇后 题目&#xff1a; 思路&#xff1a; &#xff08;1&#xff09;用回溯的思想寻找每一行皇后的位置 &#xff08;2&#xff09;皇后位置的约束&#xff0c;创建一个新函数。使得与之前行的皇后不在同一列或斜线 &#xff08;3&#xff09;45度斜线行列和相等&…

系统设计——系统安全

HTTPS 是如何工作的&#xff1f; 安全超文本传输​​协议&#xff08;HTTPS&#xff09;是超文本传输​​协议&#xff08;HTTP&#xff09;的扩展。HTTPS 使用传输层安全性&#xff08;TLS&#xff09;传输加密数据。如果数据在网上被劫持&#xff0c;劫持者得到的只是二进制…

CRM客户登记管理系统:企业数字化转型的必备工具

客户登记管理系统&#xff08;CRM&#xff09;是一种用于记录和管理客户信息的软件系统。它用于存储和跟踪客户的基本信息、联系方式、交易历史、服务请求等关键数据&#xff0c;以便企业能够更好地了解客户、提供个性化的服务&#xff0c;并进行有效的销售和营销活动。 CRM系统…

迅为RK3588开发板瑞芯微国产化工业ARM核心板AI人工智能

性能强 iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代AloT高端应用芯片&#xff0c;采用8nm LP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHz&#xff0c;8GB内存&#xff0c;32GB EMMC。 四核心…

用于噪声和分段相位测量的鲁棒相位展开算法(全文翻译-2区Optics Express)

摘要&#xff1a;本文提出了一种在存在噪声和分段相位的情况下进行相位展开的鲁棒相位展开算法&#xff08;RPUA&#xff09;。RPUA方法提出了一种新的相位导数模型&#xff0c;结合纠错迭代来实现抗噪声效果。此外&#xff0c;它使用数值载波频率和条纹外推法在空间域中桥接相…