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

news2024/9/24 9:28:09

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

感兴趣的情况下可以看一下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+"元大奖");
                }
            }
        }
    }
}

测试类:

package Exercise.Exam5;

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

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list  = new ArrayList<>();
        Collections.addAll(list,10,20,3,100,40,55,110,60,500,1000);
        Mythread mythread = new Mythread(list);
        Thread thread =new Thread(mythread);
        Thread thread2 =new Thread(mythread);
        thread.setName("抽奖箱1");
        thread2.setName("抽奖箱2");

        thread.start();
        thread2.start();
    }
}

运行结果:

 

多线程练习6 (多线程统计并求最大值)


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

线程代码:

package Exercise.Exam6;


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() {
        ArrayList<Integer> list1 = new ArrayList<>();
        int sum1=0;
        int Max = 0;
        while (true){
            synchronized (Mythread.class){
                if (list.size() ==0){
                        System.out.println(Thread.currentThread().getName()+list1+"共有"+list1.size()+"项"+"共"+sum1+"最大值为:"+Max);
                    break;
                }
                else{
                    Collections.shuffle(list);
                    int prize = list.remove(0);
                    if(prize>Max){
                        Max=prize;
                    }
                    list1.add(prize);
                    sum1 =sum1+prize;
                   }
                }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            }

        }
    }


测试类:

package Exercise.Exam6;

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

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list  = new ArrayList<>();
        Collections.addAll(list,10,20,3,100,40,55,110,60,500,1000);
        Mythread mythread = new Mythread(list);
        Thread thread =new Thread(mythread);
        Thread thread2 =new Thread(mythread);
        thread.setName("抽奖箱1");
        thread2.setName("抽奖箱2");

        thread.start();
        thread2.start();
    }
}

运行结果:

 

多线程练习7(多线程之间的比较)


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

线程代码:

package Exercise.Exam7;

import Exercise.Exam6.Mythread;

import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.Callable;

public class MyThread implements Callable<Integer> {
    ArrayList<Integer> list;

    public MyThread(ArrayList list) {
        this.list = list;
    }

    @Override
    public Integer call() throws Exception {
        ArrayList<Integer> list1 = new ArrayList<>();
        int sum1=0;
        int Max = 0;
        while (true){
            synchronized (Mythread.class){
                if (list.size() ==0){
                    System.out.println(Thread.currentThread().getName()+list1+"共有"+list1.size()+"项"+"共"+sum1+"最大值为:"+Max);
                    break;
                }
                else{
                    Collections.shuffle(list);
                    int prize = list.remove(0);
                    if(prize>Max){
                        Max=prize;
                    }
                    list1.add(prize);
                    sum1 =sum1+prize;
                }
            }
                Thread.sleep(10);
        } if (list1.size()==0){
            return null;
        }
        else
            return Collections.max(list1);
    }
}

测试类:

package Exercise.Exam7;

import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.FutureTask;

public class Test {
    public static void main(String[] args) throws Exception {
        ArrayList<Integer> list  = new ArrayList<>();
        Collections.addAll(list,10,20,3,100,40,55,110,60,500,1000);
        MyThread mythread = new MyThread(list);

        FutureTask<Integer> futureTask = new FutureTask<>(mythread);
        FutureTask<Integer> futureTask2 = new FutureTask<>(mythread);

        Thread thread = new Thread(futureTask);
        Thread thread2 = new Thread(futureTask2
        );

        thread.start();
        thread2.start();

        Integer integer = futureTask.get();
        Integer integer1 = futureTask2.get();
        if (integer1>integer){
            System.out.println("2最大奖项"+integer1);
        }
        else
            System.out.println("2最大奖项"+integer);
    }
}

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

37 深度学习(一):查看自己显卡的指令|张量|验证集|分类问题|回归问题

文章目录 查看自己显卡的指令框架选什么张量的阶数验证集存在的意义分类问题一般的全连接的代码格式&#xff08;板子&#xff09;上面训练的详解一些省略梯度消失和梯度爆炸Dropout 回归问题一般回归的全连接的板子 batch-size超参数搜索策略 此系列的深度学习主要是理论性的介…

Linux docker 安装 部署

docker 安装 linux系统离线安装docker 如何使用docker部署c/c程序 常用命令 给予 docker 访问 gui 的权限 在 /etc/profile 末尾添加 if [ "$DISPLAY" ! "" ] thenxhost fi在执行 更新 source /etc/profiledocker下载镜像 docker search gcc #搜索d…

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明

一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡&#xff0c;如果多网卡的电脑请注意对应所接的网卡&#xff0c;网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…

数据可视化报表分享:区域管理驾驶舱

在零售数据分析中&#xff0c;区域管理驾驶舱报表是用来分析企业运营数据&#xff0c;以制定销售策略和提高利润。因此这张报表需要整合大量数据&#xff0c;数据整合、分析、指标计算的工作量极大&#xff0c;在讲究高效率、高度及时性的大数据时代&#xff0c;BI数据可视化分…

APP上架怎么避免麻烦应对解决方案和替代方案

在当今数字化的时代&#xff0c;应用程序已成为现代生活中连接人与科技的桥梁。各个行业精准地抓住这一趋势&#xff0c;踊跃地推出自家APP&#xff0c;为用户提供一站式的便捷服务。然而&#xff0c;APP上架的过程并非一帆风顺。许多开发者会在上架过程中遇到麻烦&#xff0c;…

DC电源模块的短期过载能力

BOSHIDA DC电源模块的短期过载能力 DC电源模块是一种专门用来将交流电源转换为稳定直流电源的电子元件&#xff0c;适用于各种场合&#xff0c;如电子产品制造、通信、无线电、医疗等。在使用DC电源模块时&#xff0c;短期过载能力是考察其质量的重要指标之一。 短期过载能力…

共赢未来 | 大势智慧与安康市自然资源信息科技有限公司达成战略合作

10月17日至18日&#xff0c;安康市自然资源信息科技有限公司总经理黄光俊带领技术团队到武汉大势智慧科技有限公司围绕“实景三维中国、数字化建设”开展交流调研&#xff0c;并签署战略合作协议。 双方表示将以市场需求为导向&#xff0c;以技术创新为依托&#xff0c;建立长期…

nginx 动静分离 防盗链

一、动静分离环境准备静态资源配置(10.36.192.169)安装nginx修改配置文件重启nginx 动态资源配置(192.168.20.135)yum安装php修改nginx配置文件重启nginx nginx代理机配置&#xff08;192.168.20.134&#xff09;修改nginx子自配置文件重启nginx 客户端访问 二、防盗链nginx防止…

使用非空断言解决Typescript报错:对象可能为 “null“

现象如下&#xff1a; 解决办法&#xff1a;在报错的属性后面加惊叹号&#xff01;&#xff0c; 也就是非空断言 问题解决&#xff1a;

01.5.Binding

参考JusterZhu视频和文档 <TextBox.Text><Binding Path"GivenName" UpdateSourceTrigger"PropertyChanged" Mode"TwoWay"><Binding.ValidationRules><local:AgeRangeRule></local:AgeRangeRule></Binding.Val…

uni-app医院智能导诊系统源码

随着科技的迅速发展&#xff0c;人工智能已经逐渐渗透到我们生活的各个领域。在医疗行业中&#xff0c;智能导诊系统成为了一个备受关注的应用。本文将详细介绍智能导诊系统的概念、技术原理以及在医疗领域中的应用&#xff0c;分析其优势和未来发展趋势。 智能导诊系统通过人工…

74 应急响应-winlinux分析后门勒索病毒攻击

目录 操作系统(windows&#xff0c;linux)应急响应&#xff1a;常见日志类别及存储&#xff1a;补充资料&#xff1a;病毒分析病毒查杀病毒动态在线病毒扫描网站 演示案例:攻击响应-暴力破解(RDP,SSH)-Win,Linux控制响应-后门木马(Webshell,PC)-Win,Linux危害响应-病毒感染(勒索…

VSCode 设置热更新

热更新&#xff1a;文件保存后页面自动刷新&#xff0c;用于提高开发效率。 1.打开应用商店&#xff0c;搜索 live server &#xff0c;选择第一个&#xff0c;点击安装。 2.随便打开一个 HTML 文件&#xff0c;在文件中右键点击&#xff0c;选择 Open with Live Server 打开网…

Python的pip包管理器介绍和使用

Python的pip包管理器介绍和使用 什么是pip&#xff1f; pip是Python的软件包管理器&#xff0c;它可以方便地安装、升级和卸载Python软件包。它是Python的标准包管理器&#xff0c;自Python 3.4版本开始&#xff0c;已经内置在Python中。 使用pip&#xff0c;你可以轻松地安…

docker安装centos7进入后不显示当前路径的解决记录

本文记录一个小问题(仅此而已)&#xff1a; 最近我的mac使用docker安装了centos&#xff0c;但是每次(使用 docker exec -it f925c71d28ef48e7b66ed93555e30e6c272727eecd5285639b6a66c5231a99b2 /bin/sh)进入到centos时候&#xff0c;都不显示当前路径&#xff0c;只有一个 sh…

小程序设计基本微信小程序的校园生活助手系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程&#xff0c;以校园生活助手系统的实际应用需要出发&#xff0c;架构系统来改善现校园生活助手系统工作流程繁琐等问题。不仅如此以操作者…

抖音招聘直播报白:短视频流量红利和精准推送,让招聘更精准

抖音直播招聘报白是通过抖音直播方式展现职位信息&#xff0c;并与求职者进行互动的招聘方式。在抖音平台上&#xff0c;企业或者人力资源公司可以通过直播的形式&#xff0c;将职位以视频直播的方式展现出来。通过抖音直播招聘报白&#xff0c;企业或者人力资源公司可以利用抖…

Python 算法高级篇:贪心算法的原理与应用

Python 算法高级篇&#xff1a;贪心算法的原理与应用 引言 1. 什么是贪心算法&#xff1f;2. 贪心算法的应用2.1 最小生成树- Prim 算法2.2 背包问题2.3 哈夫曼编码 3. 代码示例3.1 会议室安排问题 4. 总结 引言 贪心算法是一种基于启发式的问题解决方法&#xff0c;它通过每一…

众和策略:配债不够10张怎么办?

近年来&#xff0c;跟着金融商场的展开和各类企业的资金需求增加&#xff0c;债券商场规划逐步扩展。债券作为一种重要的信誉工具&#xff0c;为企业融资供应了一个灵敏的渠道。但是&#xff0c;在进行债券发行时&#xff0c;有时候或许会遇到一个问题&#xff0c;那就是配债数…

Games104现代游戏引擎笔记 网络游戏架构基础

挑战1:网络同步 挑战2:是网络的可靠性&#xff0c;包括应对网络的延迟&#xff0c;丢包和掉线 挑战3: 反作弊和安全系统&#xff0c;因为网络游戏的本质是经济系统 挑战4:多样性(不同设备&#xff0c;不同服务器)&#xff0c;在不停服的情况下热更新 挑战5:大量人数时对高并发…