• Java之多线程的综合练习二


    练习六:多线程统计并求最大值

    需求:

    在上一题基础上继续完成如下需求:

    每次抽的过程中,不打印,抽完时一次性打印(随机)

    在此次抽奖过程中,抽奖箱1总共产生了6个奖项。

    分别为:10,20,100,500,2,300最高奖项为300元,总计额为932元

    在此次抽奖过程中,抽奖箱2总共产生了6个奖项。

    分别为:5,50,200,800,80,700最高奖项为800元,总计额为1835元

    解决方案一:

    1. public class MyThread extends Thread {
    2.    ArrayList list;
    3.    public MyThread(ArrayList list) {
    4.        this.list = list;
    5.   }
    6.    //线程一
    7.    static ArrayList list1 = new ArrayList<>();
    8.    //线程二
    9.    static ArrayList list2 = new ArrayList<>();
    10.    @Override
    11.    public void run() {
    12.        while (true) {
    13.            synchronized (MyThread.class) {
    14.                if (list.size() == 0) {
    15.                    if("抽奖箱1".equals(getName())){
    16.                        System.out.println("抽奖箱1" + list1);
    17.                   }else {
    18.                        System.out.println("抽奖箱2" + list2);
    19.                   }
    20.                    break;
    21.               } else {
    22.                    //继续抽奖
    23.                    Collections.shuffle(list);
    24.                    int prize = list.remove(0);
    25.                    if("抽奖箱1".equals(getName())){
    26.                        list1.add(prize);
    27.                   }else {
    28.                        list2.add(prize);
    29.                   }
    30.               }
    31.           }
    32.            try {
    33.                Thread.sleep(10);
    34.           } catch (InterruptedException e) {
    35.                e.printStackTrace();
    36.           }
    37.       }
    38.   }
    39. }
    40. public class Test {
    41.    public static void main(String[] args) {
    42.        /*
    43.            有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,2,80,300,700};
    44.            创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”
    45.            随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
    46.            每次抽的过程中,不打印,抽完时一次性打印(随机)   在此次抽奖过程中,抽奖箱1总共产生了6个奖项。
    47.                分别为:10,20,100,500,2,300最高奖项为300元,总计额为932元
    48.            在此次抽奖过程中,抽奖箱2总共产生了6个奖项。
    49.                分别为:5,50,200,800,80,700最高奖项为800元,总计额为1835元
    50.        */
    51.        //创建奖池
    52.        ArrayList list = new ArrayList<>();
    53.        Collections.addAll(list,10,5,20,50,100,200,500,800,2,80,300,700);
    54.        //创建线程
    55.        MyThread t1 = new MyThread(list);
    56.        MyThread t2 = new MyThread(list);
    57.        //设置名字
    58.        t1.setName("抽奖箱1");
    59.        t2.setName("抽奖箱2");
    60.        //启动线程
    61.        t1.start();
    62.        t2.start();
    63.   }
    64. }

    解决方案二:

    1. public class MyThread extends Thread {
    2.    ArrayList list;
    3.    public MyThread(ArrayList list) {
    4.        this.list = list;
    5.   }
    6.    @Override
    7.    public void run() {
    8.        ArrayList boxList = new ArrayList<>();//1 //2
    9.        while (true) {
    10.            synchronized (MyThread.class) {
    11.                if (list.size() == 0) {
    12.                    System.out.println(getName() + boxList);
    13.                    break;
    14.               } else {
    15.                    //继续抽奖
    16.                    Collections.shuffle(list);
    17.                    int prize = list.remove(0);
    18.                    boxList.add(prize);
    19.               }
    20.           }
    21.            try {
    22.                Thread.sleep(10);
    23.           } catch (InterruptedException e) {
    24.                e.printStackTrace();
    25.           }
    26.       }
    27.   }
    28. }
    29. public class Test {
    30.    public static void main(String[] args) {
    31.        /*
    32.            有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,2,80,300,700};
    33.            创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”
    34.            随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
    35.            每次抽的过程中,不打印,抽完时一次性打印(随机)   在此次抽奖过程中,抽奖箱1总共产生了6个奖项。
    36.                分别为:10,20,100,500,2,300最高奖项为300元,总计额为932元
    37.            在此次抽奖过程中,抽奖箱2总共产生了6个奖项。
    38.                分别为:5,50,200,800,80,700最高奖项为800元,总计额为1835元
    39.        */
    40.        //创建奖池
    41.        ArrayList list = new ArrayList<>();
    42.        Collections.addAll(list,10,5,20,50,100,200,500,800,2,80,300,700);
    43.        //创建线程
    44.        MyThread t1 = new MyThread(list);
    45.        MyThread t2 = new MyThread(list);
    46.        //设置名字
    47.        t1.setName("抽奖箱1");
    48.        t2.setName("抽奖箱2");
    49.        //启动线程
    50.        t1.start();
    51.        t2.start();
    52.   }
    53. }

    练习七:多线程之间的比较

    需求:

    在上一题基础上继续完成如下需求:

    在此次抽奖过程中,抽奖箱1总共产生了6个奖项,分别为:10,20,100,500,2,300

    最高奖项为300元,总计额为932元

    在此次抽奖过程中,抽奖箱2总共产生了6个奖项,分别为:5,50,200,800,80,700

    最高奖项为800元,总计额为1835元

    在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为800元

    以上打印效果只是数据模拟,实际代码运行的效果会有差异

    1. public class MyCallable implements Callable {
    2.    ArrayList list;
    3.    public MyCallable(ArrayList list) {
    4.        this.list = list;
    5.   }
    6.    @Override
    7.    public Integer call() throws Exception {
    8.        ArrayList boxList = new ArrayList<>();//1 //2
    9.        while (true) {
    10.            synchronized (MyCallable.class) {
    11.                if (list.size() == 0) {
    12.                    System.out.println(Thread.currentThread().getName() + boxList);
    13.                    break;
    14.               } else {
    15.                    //继续抽奖
    16.                    Collections.shuffle(list);
    17.                    int prize = list.remove(0);
    18.                    boxList.add(prize);
    19.               }
    20.           }
    21.            Thread.sleep(10);
    22.       }
    23.        //把集合中的最大值返回
    24.        if(boxList.size() == 0){
    25.            return null;
    26.       }else{
    27.            return Collections.max(boxList);
    28.       }
    29.   }
    30. }
    31. package com.itheima.test7;
    32. import java.util.ArrayList;
    33. import java.util.Collections;
    34. import java.util.concurrent.ExecutionException;
    35. import java.util.concurrent.FutureTask;
    36. public class Test {
    37.    public static void main(String[] args) throws ExecutionException, InterruptedException {
    38.        /*
    39.            有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为 {10,5,20,50,100,200,500,800,2,80,300,700};
    40.            创建两个抽奖箱(线程)设置线程名称分别为   "抽奖箱1", "抽奖箱2"
    41.            随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
    42.            在此次抽奖过程中,抽奖箱1总共产生了6个奖项,分别为:10,20,100,500,2,300
    43.          最高奖项为300元,总计额为932元
    44.            在此次抽奖过程中,抽奖箱2总共产生了6个奖项,分别为:5,50,200,800,80,700
    45.           最高奖项为800元,总计额为1835元
    46.            在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为800元
    47.            核心逻辑:获取线程抽奖的最大值(看成是线程运行的结果)
    48.            以上打印效果只是数据模拟,实际代码运行的效果会有差异
    49.        */
    50.        //创建奖池
    51.        ArrayList list = new ArrayList<>();
    52.        Collections.addAll(list,10,5,20,50,100,200,500,800,2,80,300,700);
    53.        //创建多线程要运行的参数对象
    54.        MyCallable mc = new MyCallable(list);
    55.        //创建多线程运行结果的管理者对象
    56.        //线程一
    57.        FutureTask ft1 = new FutureTask<>(mc);
    58.        //线程二
    59.        FutureTask ft2 = new FutureTask<>(mc);
    60.        //创建线程对象
    61.        Thread t1 = new Thread(ft1);
    62.        Thread t2 = new Thread(ft2);
    63.        //设置名字
    64.        t1.setName("抽奖箱1");
    65.        t2.setName("抽奖箱2");
    66.        //开启线程
    67.        t1.start();
    68.        t2.start();
    69.        Integer max1 = ft1.get();
    70.        Integer max2 = ft2.get();
    71.        System.out.println(max1);
    72.        System.out.println(max2);
    73.        //在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为800元
    74.        if(max1 == null){
    75.            System.out.println("在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为"+max2+"元");
    76.       }else if(max2 == null){
    77.            System.out.println("在此次抽奖过程中,抽奖箱1中产生了最大奖项,该奖项金额为"+max1+"元");
    78.       }else if(max1 > max2){
    79.            System.out.println("在此次抽奖过程中,抽奖箱1中产生了最大奖项,该奖项金额为"+max1+"元");
    80.       }else if(max1 < max2){
    81.            System.out.println("在此次抽奖过程中,抽奖箱2中产生了最大奖项,该奖项金额为"+max2+"元");
    82.       }else{
    83.            System.out.println("两者的最大奖项是一样的");
    84.       }
    85.   }
    86. }
  • 相关阅读:
    使用 Set-Cookies HttpOnly & Secure标志保护 Tomcat
    K8S 实用工具之一 - 如何合并多个 kubeconfig?
    JDK的安装
    Visual Studio 2019光标变成灰色方块问题
    ▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch0 一张图讲完强化学习原理
    自媒体怎么入门?过来人的三点建议,快看看
    华为数通方向HCIP-DataCom H12-831题库(单选题:201-220)
    Ubuntu安装步骤
    Hadoop3教程(一):Hadoop的定义、组成及全生态概览
    网络游戏协议:基于Protobuf的序列化与反序列化
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/133500735