学习线程池,模拟多线程抢红包

多线程线程池,发红包案例

  1. 多线程线程池
    1).线程池就是首先创建一些线程,他们的集合称之为线程池。线程池在系统启动时会创建大量空闲线程,程序将一个任务传递给线程池,线程池就会启动一条线程来执行这个任务,执行结束后线程不会销毁(死亡),而是再次返回到线程池中成为空闲状态,等待执行下一个任务。
    2).线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后再需要执行新的任务时重用这些线程而不是新建线程。
  2. 为什么要用到线程池
    多线程运行时,系统不断创建和销毁新的线程,成本非常高,会过度的消耗系统资源,从而可能导致系统资源崩溃,使用线程池就是最好的选择。
  3. 了解一个标准的线程池的模型

这里是引用

  1. 通过Executor工厂类中的静态方法获取线程池对象:
    1).第一种:newCachedThreadPool:线程的数据是不做限制的,每次有任务来的时候都会以任务优先,性能最大化(也就是服务器压力比较大
    2).第二种:newFixedThreadPool:可以让压力不那么大,并且可以规定线程的数量,当线程的数量达到指定数量的时候,这个时候就不会再有新的线程了
    3).第三种:newSingleThreadExecutor:绝对的安全,不考虑性能,因为是单线程,永远只有一个线程来执行任务。
  2. 线程池的工作流程:
    在这里插入图片描述
    6.利用线程池,模拟多线程抢红包,简单说一下需求分析:
    1).要有总金额、红包数量。
    2).每次抢到的红包金额是一个随机数字,随机数字需要有一个最小值,比如最小也有1分钱,不能是0。
    3).随机数的范围应该小于剩余金额,此处采用二倍均值方法,可以使金额的随机值更加平均。
    4).为了实现时减少小数的处理,将金额的单位转换为分。
//创建一个红包类,
public class HongBao implements Runnable {
    private int total;//总钱数
    private int count;//红包数
    private final int min = 1;

    public HongBao(int total, int count) {
        this.total = total * 100;
        this.count = count;
    }

    @Override
    public void run() {
        synchronized (this) {
            if (count == 0) {
                System.out.println(Thread.currentThread().getName() + "没了,强毛钱");
            } else {
                int money = 0;//抢到的钱
                if (count == 1) {
                    money = total;//剩余的钱
                } else {
                    Random random = new Random();
//                    int balance = total - (count - 1) * min; //随机余额的最大范围
                    int balance = total / count * 2;// 二倍均值方法
                    money = random.nextInt(balance);
                    if (balance < min) {
                        money = min;
                    }
                }
                System.out.println(Thread.currentThread().getName() + "抢到:" + money / 100.0 + "元");
                total = total - money;
                count--;
            }
        }
    }
}
//测试类:
public class Test1 {
    public static void main(String[] args) {
        HongBao hongBao = new HongBao(10, 5);
        for (int i = 1; i <= 6; i++) {
            new Thread(hongBao).start();
        }
    }
}

学到这里本篇已完结,我们下期再见!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值