当前位置: 首页 > news >正文

Java | 多线程综合练习

不爱生姜不吃醋⭐️
如果本文有什么错误的话欢迎在评论区中指正
与其明天开始,不如现在行动!

文章目录

  • 🌴前言
  • 🌴一、卖电影票
    • 1.题目
    • 2.分析
    • 3.代码
  • 🌴二、送礼物
    • 1. 题目
    • 2. 分析
    • 3.代码
  • 🌴三.打印奇数
    • 1. 题目
    • 2. 分析
    • 3.代码
  • 🌴四.抢红包
    • 1. 题目
    • 2. 分析
    • 3.代码
  • 🌴五.抽奖
    • 1. 题目
    • 2. 分析
    • 3.代码
  • 🌴总结


🌴前言

为了能够对多线程方面有一个更加深入和全面的了解,做五道多线程相关的题目,其中1-3简单,4-5题需要在方法上有些改进。


🌴一、卖电影票

1.题目

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

2.分析

题目较为简单,用Thread多线程完成。

3.代码

自己定义一个类

public class MyThread extends Thread{static int ticket = 1000;@Overridepublic void run() {while (true){synchronized (MyThread.class){if (ticket == 0){break;}try {sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}ticket--;System.out.println(getName()+"正在卖票,还剩余"+ticket+"张票!");}}}
}

启动线程

public class Demo {public static void main(String[] args) {MyThread mt1 = new MyThread();MyThread mt2 = new MyThread();mt1.setName("窗口一");mt2.setName("窗口二");mt1.start();mt2.start();}
}

🌴二、送礼物

1. 题目

有100份礼物,由两个人同时发,当剩下的礼品小于10份的时候就停止发放,利用多线程模拟该过程并将线程的名字个礼物的剩余数量打印出来。

2. 分析

思路同题目一

3.代码

自己定义一个类

public class MyThread extends Thread{static int gift = 10000;@Overridepublic void run() {while (true) {synchronized (MyThread.class) {if (gift < 10) {break;}gift--;System.out.println(getName()+"正在发礼物,还剩余"+gift+"件礼物!");}}}
}

启动线程

public class Demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("同学甲");t2.setName("同学乙");t1.start();t2.start();}
}

🌴三.打印奇数

1. 题目

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

2. 分析

思路同题目一

3.代码

自己定义一个类

public class MyThread extends Thread {static int num = 1;@Overridepublic void run() {while (true) {synchronized (MyThread.class) {if (num == 100) {break;}if (num % 2 != 0) {System.out.println("当前是线程"+getName()+"正在输出,数字:"+num);}num++;}}}
}

启动线程

public class Demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}
}

🌴四.抢红包

1. 题目

假设有100块被分成了3个红包,有五个人去抢。打印结果:
XXX抢到了XX元
XXX抢到了X元
X没抢到

2. 分析

其中,红包是共享数据,五个人是五条线程。

3.代码

自己定义一个类

public class MyThread extends Thread {static int money = 100;static int count = 3;static final int MIN = 1;@Overridepublic void run() {synchronized (MyThread.class) {int prize = 0;if (count == 0) {System.out.println(getName() + "没抢到!");} else {if (count == 1) {prize = money;} else {Random r = new Random();int bounds = money - (count - 1) * MIN + 1;prize = r.nextInt(bounds);}money -= prize;count--;System.out.println(getName() + "抢到" + prize + "元!");}}}
}

启动线程来抢红包

public class Demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();MyThread t3 = new MyThread();MyThread t4 = new MyThread();MyThread t5 = new MyThread();t1.setName("小明");t2.setName("小红");t3.setName("小李");t4.setName("小强");t5.setName("小风");t1.start();t2.start();t3.start();t4.start();t5.start();}
}

🌴五.抽奖

1. 题目

有两个抽奖箱存放了奖励金额且奖励金额不重复,分别为:2,5,10,20,50,80,100,200,500,700,800。
如果有人抽中奖,那么就把抽中的奖项显示出来,例如:
抽奖箱1产生了10元奖励
抽奖箱2产生了200元奖励
抽奖箱1产生了800元奖励

2. 分析

两个抽奖箱是两个线程,随机抽取打印

3.代码

定义一个类

public class MyThread extends Thread{ArrayList<Integer> list = new ArrayList<>();public MyThread(ArrayList<Integer> list) {this.list = list;}@Overridepublic void run() {while (true) {synchronized (MyThread.class) {if (list.size() == 0) {break;}Collections.shuffle(list);Integer prize = list.remove(0);System.out.println(getName()+"产生了"+prize+"元大奖!");try {sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}
}

启动线程

public class Demo {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,2,5,10,20,50,80,100,200,500,700,800);MyThread t1 = new MyThread(list);MyThread t2 = new MyThread(list);t1.setName("奖箱1");t2.setName("奖箱2");t1.start();t2.start();}
}

🌴总结

文章中代码的编写使用的都是Java多线程和集合方面的知识,多加练习熟能生巧。
本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!


http://www.lryc.cn/news/169215.html

相关文章:

  • Kotlin变量与控制条件的基本用法
  • 第18章_瑞萨MCU零基础入门系列教程之GPT
  • openssl websockets
  • Vue 组件的单元测试
  • 海底两万里的思维导图,轻松了解整体的内容
  • ZABBIX 6.4官方安装文档
  • 本地MQTT服务器搭建(EMQX)
  • Docker启动pandora并指定ACCESS TOKEN
  • Python + Jmeter 实现自动化性能压测
  • 【Linux进行时】进程状态
  • HarmonyOS开发环境搭建
  • 友思特新闻|友思特与IDS深化战略合作伙伴关系
  • ARM Linux DIY(十三)Qt5 移植
  • 二,手机硬件参数介绍和校验算法
  • ubunutu20/18/22 编译android 5相关的问题汇总-千里马framework开源代码平板编译过程
  • tauri vue vite
  • 名词解析与经验分享(前端)
  • 【前端】js下载url文件
  • 什么是 BSD 协议?
  • 【网络教程】揭秘Windows SSH服务端免密登录:告别繁琐,享受安全连接
  • 使用键盘控制Franka机械臂运动
  • 力扣第45天----第392题、第115题
  • 扔掉你的开发板,跟我玩Mcore-全志h616
  • 【Linux】网络篇:UDP、TCP 网络接口及使用
  • 卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-2
  • SQL 性能优化总结
  • MYSQL事务隔离级别分析
  • 学习javaEE初阶的第一堂课
  • 请问一下就是业务概念模型和业务逻辑模型有啥关系
  • 3.2 Android eBPF程序类型