java利用多线程模拟一个抢答器,总共抢答轮次为10次,要求设置三个抢答者,之后同时发出强大指令,抢答成功提示,未抢答成功返回失败
时间: 2024-01-04 08:02:25 浏览: 21
好的,我可以帮你解决这个问题。下面是一个简单的Java多线程程序,可以模拟一个抢答器。
```java
import java.util.Random;
public class Quizzer implements Runnable {
private static final int ROUNDS = 10;
private static final int NUM_PLAYERS = 3;
private static final int ANSWER_TIME = 3000;
private static final Object lock = new Object();
private static boolean hasWinner = false;
private final int id;
private final Random random = new Random();
public Quizzer(int id) {
this.id = id;
}
@Override
public void run() {
for (int i = 0; i < ROUNDS; i++) {
try {
Thread.sleep(random.nextInt(1000)); // 模拟思考时间
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock) {
if (!hasWinner) {
System.out.println("Round " + (i + 1) + ": Player " + id + " is answering...");
try {
lock.wait(ANSWER_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!hasWinner) {
hasWinner = true;
System.out.println("Round " + (i + 1) + ": Player " + id + " wins!");
lock.notifyAll();
return;
}
}
}
}
System.out.println("Player " + id + " failed to win.");
}
public static void main(String[] args) throws InterruptedException {
Thread[] players = new Thread[NUM_PLAYERS];
for (int i = 0; i < NUM_PLAYERS; i++) {
players[i] = new Thread(new Quizzer(i + 1));
players[i].start();
}
for (Thread player : players) {
player.join();
}
}
}
```
这个程序定义了一个`Quizzer`类,实现了`Runnable`接口,每个`Quizzer`对象代表一个抢答者。程序创建了三个线程,每个线程启动时创建一个`Quizzer`对象,模拟抢答的过程。`hasWinner`变量表示是否已经有人抢答成功,这个变量需要在多个线程之间共享,所以需要使用`synchronized`来实现同步。每个线程在抢答的时候,首先会检查是否已经有人抢答成功了,如果没有,就尝试抢答。如果抢答成功,就设置`hasWinner`变量为`true`,并且通知其他线程。如果抢答失败,就继续下一轮抢答。
注意,为了让程序更加生动,我在每个抢答者抢答前加了一个随机的思考时间。你可以根据需要调整这个时间。另外,程序中的抢答轮次、抢答者数量、抢答时间等参数都是可以调整的,你可以根据需要自行修改。