一、需求
二、思路
- 创建红包集合,红包金额随机生成
- 继承线程类,重写构造器和run方法
三、代码
1.原始创建线程类
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;
}
}
}
}
}
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.线程池分配
@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();//打印异常信息
}
}
}
}
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;
}
}