[Java] 纯文本查看 复制代码 import java.util.ArrayList;
import java.util.Collections;
//抽奖池,实现runnable接口
public class LotterDraw1 implements Runnable{
//创建一个集合,盛放所有的奖项。
private static ArrayList<Integer> award;
//创建一个集合存放抽到的奖项
private ArrayList<Integer> getAward = new ArrayList<Integer>();
//静态代码块,随着类的加载而加载,且只加载一次。
static {
award = new ArrayList<Integer>();
award.add(10);
award.add(5);
award.add(20);
award.add(100);
award.add(200);
award.add(500);
award.add(800);
award.add(2);
award.add(80);
award.add(300);
award.add(700);
}
@Override
public void run() {
//编写抽奖的逻辑
while(true) {
synchronized (LotterDraw1.class) {
if(award.size()>0) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//首先打乱奖项的顺序
Collections.shuffle(award);
//每次都去取集合中第一个元素放入两个不同奖箱中
getAward.add(award.get(0));
//将取到的奖项移除掉
award.remove(0);
}else {
int max = getAward.get(0);
int size = getAward.size();
int sum =0;
StringBuilder sb = new StringBuilder();
for (int i=0;i<getAward.size();i++) {
if(getAward.get(i)>max) {
max = getAward.get(i);
}
sum+=getAward.get(i);
if(i == getAward.size()-1) {
sb.append(getAward.get(i));
}else {
sb.append(getAward.get(i)).append(",");
}
}
System.out.println("在此次抽奖过程中,"+Thread.currentThread().getName()+"总共产生了"+size+"个奖项,分别为:"+sb+"最高奖项为"+max+"元,总计额为"+sum+"元");
break;
}
}
}
}
}
public class Test04_1 {
public static void main(String[] args) {
/*
* 创建LotterDraw对象
* 为什么要创建两个实现类对象?
* 因为抽到的奖项是放到各自的 奖箱中盛放,所以要创建两个集合去分别盛放。
* 也就是每次创建对象都会创建一次集合。
* 如果只创建一个对象,那么创建的是同一个集合,遍历的也是同一个集合
*/
LotterDraw1 lotterDraw = new LotterDraw1();
LotterDraw1 lotterDraw2 = new LotterDraw1();
//创建线程
Thread t1 = new Thread(lotterDraw);
t1.setName("抽奖箱1");
t1.start();
Thread t2 = new Thread(lotterDraw2);
t2.setName("抽奖箱2");
t2.start();
}
}
|