使用java多线程 完成抽奖活动
时间: 2023-10-14 08:04:57 浏览: 43
好的,以下是一个简单的使用Java多线程完成抽奖活动的示例代码:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class LuckyDraw {
private List<String> participants; // 参与者名单
private List<String> winners; // 中奖者名单
private int winnerCount; // 中奖人数
public LuckyDraw(List<String> participants, int winnerCount) {
this.participants = participants;
this.winners = new ArrayList<>();
this.winnerCount = winnerCount;
}
public void startLuckyDraw() {
int participantCount = participants.size();
int threadCount = Math.min(participantCount, winnerCount); // 线程数不能超过参与者数和中奖人数的较小值
int participantPerThread = participantCount / threadCount; // 每个线程抽取的参与者数
int remainder = participantCount % threadCount; // 余数,将多余的参与者分配给前面的线程
// 创建线程池
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < threadCount; i++) {
int start = i * participantPerThread + Math.min(i, remainder); // 计算该线程开始抽取的参与者的下标
int end = start + participantPerThread + (i < remainder ? 1 : 0); // 计算该线程结束抽取的参与者的下标
threads.add(new Thread(new LuckyDrawTask(start, end)));
}
// 启动线程
for (Thread thread : threads) {
thread.start();
}
// 等待所有线程结束
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 输出中奖者名单
System.out.println("中奖者名单:");
for (String winner : winners) {
System.out.println(winner);
}
}
private class LuckyDrawTask implements Runnable {
private int start;
private int end;
public LuckyDrawTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public void run() {
Random random = new Random();
for (int i = start; i < end && winners.size() < winnerCount; i++) {
try {
Thread.sleep(1000); // 模拟抽奖过程
} catch (InterruptedException e) {
e.printStackTrace();
}
String participant = participants.get(i);
if (random.nextBoolean()) {
synchronized (winners) {
winners.add(participant);
}
}
}
}
}
public static void main(String[] args) {
List<String> participants = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
participants.add("参与者" + i);
}
int winnerCount = 3;
LuckyDraw luckyDraw = new LuckyDraw(participants, winnerCount);
luckyDraw.startLuckyDraw();
}
}
```
上述代码中,我们通过创建多个线程来并行抽取参与者,并使用`synchronized`关键字来保证中奖者名单的线程安全。同时,我们还使用了`Thread.sleep()`方法来模拟抽奖过程。
在`main`方法中,我们创建了一个包含50个参与者的抽奖活动,并设置中奖人数为3,最终输出中奖者名单。