Java多线程学习_抽奖箱

有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:

抽奖箱1 又产生了一个 10 元大奖
抽奖箱2 又产生了一个 100 元大奖	
//.....

Java多线程学习_抽奖箱_第1张图片

package cn.njit.test;

import java.util.ArrayList;
import java.util.List;

public class Test_duoxiancheng_929_1 {

public static void main(String[] args) {
	int[] arr = { 10, 5, 20, 50, 100, 200, 500, 800, 2, 80, 300 };
	List list = new ArrayList();
	for (int i = 0; i < arr.length; i++) {
		list.add(arr[i]);
	}

	ChoujX cjx = new ChoujX(list);

	Thread t1 = new Thread(cjx, "抽奖箱1");
	Thread t2 = new Thread(cjx, "抽奖箱2");
	t1.start();
	t2.start();

}

}
class ChoujX implements Runnable {
private Object key = new Object();
List list;

public ChoujX() {

}

public ChoujX(List list) {
	this.list = list;
}

@Override
public void run() {

	while (list.size() > 0) {
		synchronized (key) {
			try {
				Thread.sleep(5);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// 这行if如果被注释,最后一次会跳空指针异常
			if (list.size() == 0) {
				return;
			}
			int num = (int) (list.size() * Math.random());
			System.out.println(Thread.currentThread().getName() + "又抽出了" + list.get(num) + "大奖");
			list.remove(list.get(num));
		}
	}
}

}

注意:由于现在电脑性能很强,一般运行的时候会出现线程1直接跑完全程的情况,多运行几次就能看出来了;

你可能感兴趣的:(Java)