多线程线程池,发红包案例
- 多线程线程池
1).线程池就是首先创建一些线程,他们的集合称之为线程池。线程池在系统启动时会创建大量空闲线程,程序将一个任务传递给线程池,线程池就会启动一条线程来执行这个任务,执行结束后线程不会销毁(死亡),而是再次返回到线程池中成为空闲状态,等待执行下一个任务。
2).线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后再需要执行新的任务时重用这些线程而不是新建线程。 - 为什么要用到线程池
多线程运行时,系统不断创建和销毁新的线程,成本非常高,会过度的消耗系统资源,从而可能导致系统资源崩溃,使用线程池就是最好的选择。 - 了解一个标准的线程池的模型
- 通过Executor工厂类中的静态方法获取线程池对象:
1).第一种:newCachedThreadPool:线程的数据是不做限制的,每次有任务来的时候都会以任务优先,性能最大化(也就是服务器压力比较大
2).第二种:newFixedThreadPool:可以让压力不那么大,并且可以规定线程的数量,当线程的数量达到指定数量的时候,这个时候就不会再有新的线程了
3).第三种:newSingleThreadExecutor:绝对的安全,不考虑性能,因为是单线程,永远只有一个线程来执行任务。 - 线程池的工作流程:
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();
}
}
}
学到这里本篇已完结,我们下期再见!