java多线程随机抽奖
时间: 2023-11-21 22:58:14 浏览: 39
以下是Java多线程随机抽奖的一个例子:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class LuckyDraw {
private static final int SEAT_COUNT = 100; // 座位数
private static final int THREAD_COUNT = 10; // 线程数
private static final int DRAW_COUNT = 10; // 抽奖次数
private static List<Integer> seatList = new ArrayList<>(); // 座位号列表
private static List<Integer> luckyList = new ArrayList<>(); // 中奖号码列表
static {
for (int i = 1; i <= SEAT_COUNT; i++) {
seatList.add(i);
}
}
public static void main(String[] args) {
for (int i = 1; i <= THREAD_COUNT; i++) {
new DrawThread("线程" + i).start();
}
}
static class DrawThread extends Thread {
public DrawThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 1; i <= DRAW_COUNT; i++) {
synchronized (seatList) {
int index = new Random().nextInt(seatList.size());
int seat = seatList.get(index);
seatList.remove(index);
System.out.println(this.getName() + "抽到了座位号:" + seat);
synchronized (luckyList) {
luckyList.add(seat);
}
}
}
}
}
}
```
上述代码中,我们首先定义了座位数、线程数和抽奖次数等常量。然后在静态代码块中初始化了座位号列表。接着定义了一个内部类`DrawThread`,继承自`Thread`类,用于表示抽奖的线程。在`DrawThread`的`run`方法中,我们使用`synchronized`关键字对座位号列表进行同步,以避免多个线程抽到同一个座位号。具体来说,我们使用`Random`类生成一个随机数,然后从座位号列表中取出对应的座位号,并将其从列表中删除。接着,我们使用`synchronized`关键字对中奖号码列表进行同步,将抽到的座位号添加到中奖号码列表中。最后,我们在`main`方法中创建了10个`DrawThread`线程,并启动它们。