java 用两个线程玩猜字游戏,第一个线程负责随机给出1-100之间的整数,第二个线程负责猜出这个数。要求当第二个线程给出自己的猜测后,第一个线程都会提示“猜小了”或“猜大了”或“猜对了”。在猜数之前,要求第二个线程等待第一个线程设置好要猜测的数字。第一个线程设置好猜测的数后,两个线程还要互相等待,其原则是第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个线程给出提示后,等待第二个线程给出的猜测,如此进行,直到第二个线程给出正确的猜测后两个线程进入死亡状态。
时间: 2023-11-24 21:07:00 浏览: 105
下面是一个简单的 Java 程序实现该猜字游戏:
```java
import java.util.Random;
public class GuessNumberGame {
public static void main(String[] args) {
NumberGenerator numberGenerator = new NumberGenerator();
Guesser guesser = new Guesser(numberGenerator);
numberGenerator.start();
guesser.start();
}
}
class NumberGenerator extends Thread {
private int number;
public synchronized void run() {
Random random = new Random();
number = random.nextInt(100) + 1;
System.out.println("猜测的数字为:" + number);
notify();
}
public synchronized int getNumber() {
while (number == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return number;
}
}
class Guesser extends Thread {
private NumberGenerator numberGenerator;
public Guesser(NumberGenerator numberGenerator) {
this.numberGenerator = numberGenerator;
}
public void run() {
int guess;
while ((guess = readGuess()) != numberGenerator.getNumber()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("猜对了!");
}
private int readGuess() {
System.out.print("请输入一个1-100之间的整数:");
int guess = -1;
try {
guess = Integer.parseInt(System.console().readLine());
} catch(NumberFormatException e) {
System.out.println("输入错误,请重新输入。");
guess = readGuess();
}
return guess;
}
}
```
在上面的代码中,`NumberGenerator` 类负责生成随机数,并且在生成随机数后通知 `Guesser` 类线程可以开始猜测。`Guesser` 类线程则负责读取用户的猜测,然后判断是否和 `NumberGenerator` 类生成的随机数相等,如果不相等,则根据生成的随机数给出提示。
在 `NumberGenerator` 类中,我们使用 `synchronized` 关键字来保证多线程访问 `number` 变量的安全性。在 `getNumber()` 方法中,使用 `wait()` 方法来等待 `number` 变量的值被设置。当 `number` 变量的值被设置后,调用 `notify()` 方法通知 `Guesser` 类线程开始猜测。
在 `Guesser` 类中,我们使用 `while` 循环来持续读取用户的猜测。如果读取的猜测与生成的随机数不相等,则调用 `Thread.sleep()` 方法等待一段时间后再次读取用户的猜测。当读取的猜测与生成的随机数相等时,输出“猜对了!”的提示信息。
阅读全文