JavaSE项目实践:红包雨-线程池/线程

一、需求

二、思路

  • 创建红包集合,红包金额随机生成
  • 继承线程类,重写构造器和run方法

三、代码

1.原始创建线程类

java 复制代码
public class GRPThread extends Thread {
    private final List<Integer> redPacket;
    private String name;
    public GRPThread(List<Integer> redPacket, String name) {
       super(name);
        this.redPacket = redPacket;
    }
    @Override
    public void run() {
        //100个人来抢集合中的钱
        String name = Thread.currentThread().getName();
        while (true) {
            synchronized (redPacket) {
                if (redPacket.isEmpty()) {break;}
                //随机一个索引取钱
                int index = (int) (Math.random() * redPacket.size());
                    int money = redPacket.remove(index);
                    System.out.println(name + "抢到钱了,金额为:" + money);
                if (!redPacket.isEmpty()) {
                    System.out.println("活动结束了!");
                    break;
                }
            }
        }
    }
}
java 复制代码
public class main {
    //100个员工竞争200个红包
    public static void main(String[] args) {
        List<Integer> redPacket = getRedPacket();
        for(int i=0;i<100;i++){
            new GRPThread(redPacket,"员工"+i).start();
        }
    }
    public static List<Integer> getRedPacket() {
        //小红包在【0~30】之间,总占比80%,大红包在【31~100】之间,总占比20%
        List<Integer> redPacket = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
            if (i < 160) {
                redPacket.add((int) (Math.random() * 30));
            } else {
                redPacket.add((int) (Math.random() * 70) + 31);
            }
        }
        return redPacket;
    }
}

2.线程池分配

java 复制代码
@Data
public class GRPThread implements Runnable {
    private final List<Integer> redPacket;
    private String name;
    public GRPThread(List<Integer> redPacket, String name) {
        this.redPacket = redPacket;
        this.name = name;
    }
    @Override
    public void run() {
        //100个人来抢集合中的钱
       // String name = Thread.currentThread().getName();
        while (true) {
            synchronized (redPacket) {
                if (redPacket.isEmpty()) {break;}
                //随机一个索引取钱
                int index = (int) (Math.random() * redPacket.size());
                    int money = redPacket.remove(index);
                    System.out.println(name + "抢到钱了,金额为:" + money);
                    //抢太快了
                if (redPacket.isEmpty()) {
                    System.out.println("活动结束了!");
                    break;
                }
            }
            try {
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();//打印异常信息
            }
        }
    }
}
java 复制代码
public class main {
    //100个员工竞争200个红包
    public static void main(String[] args) {
        List<Integer> redPacket = getRedPacket();
        ThreadPoolExecutor TPE =new ThreadPoolExecutor(25, 50, 1000,
                TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(200),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
        for(int i=1;i<101;i++){
            TPE.execute(new GRPThread(redPacket,"员工"+i));
        }
    }
    public static List<Integer> getRedPacket() {
        //小红包在【0~30】之间,总占比80%,大红包在【31~100】之间,总占比20%
        List<Integer> redPacket = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
            if (i < 160) {
                redPacket.add((int) (Math.random() * 30));
            } else {
                redPacket.add((int) (Math.random() * 70) + 31);
            }
        }
        return redPacket;
    }
}
相关推荐
外收内放2 小时前
Python基础语法练习题(56优化版补充)
开发语言·python
小羊没烦恼!2 小时前
jQuery1.5的改进细节
java·服务器·开发语言·前端·c#
霸道流氓气质2 小时前
Prompt 版本控制与 A/B 测试实战:语义版本管理、一致性哈希分流与 Thompson Sampling 的 Java 生产级实现
java·prompt·哈希算法
程序员老陆2 小时前
C++ 未定义行为全景:对象模型、优化边界与工程防御
开发语言·c++·程序设计
嵌入式er2 小时前
影石系统组 一二面OC面经
java·开发语言
徐小黑ACG2 小时前
Golang 基础06 接口interface
开发语言·后端·golang
春涧草茶2 小时前
慢就是快12-12手动抛出异常
java·linux·前端
半杯咖啡半行码2 小时前
Qt 开发基础:版本演进、常用工具与多平台安装
开发语言·qt
下页、再停留3 小时前
【C#桌面客户端系列学习-8】批量导出数据为csv格式
开发语言·c#·visual studio