用两个线程玩猜数字游戏,第-一个线程负责随机给出1~100的一个整数,第二个线程负责猜出这个数。要求每当第二个线程给出自己的猜测后,第-一个线程都会提示“猜小了”“猜大了”或“猜对了”。猜数之前,要求第二个线程要等待第-一个线程设置好要猜测的数。第一个线程设置好猜测数之后,两个线程还要互相等待,其原则是:第二个线程给出自己的猜测后,等待第一个线程给出提示;第一个线程给出提示后,等待第二个线程给出猜测,如此进行,直到第二个线程给出正确的猜测后,两个线程进人死亡状态。 ,模拟 3 个线程猜数字,一个线程负责给出要猜测的数字,另外两个线程负责猜测。用java语言
时间: 2023-08-07 15:05:17 浏览: 41
以下是用Java语言实现的代码:
```java
import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class GuessNumberGame {
private volatile boolean isOver = false; // 双方是否都猜对了
private volatile int target; // 要猜的数字
private final Lock lock = new ReentrantLock(); // 共享锁
private final Condition guessCondition = lock.newCondition(); // 猜测条件
private final Condition hintCondition = lock.newCondition(); // 提示条件
// 第一个线程,负责设置要猜的数字
private final Runnable setter = () -> {
Random random = new Random();
lock.lock();
try {
target = random.nextInt(100) + 1; // 随机生成1~100之间的整数
System.out.println("要猜的数字已经设置好了,开始猜吧!");
guessCondition.signalAll(); // 唤醒所有等待猜测的线程
while (!isOver) { // 如果双方都还没有猜对
hintCondition.await(); // 等待猜测线程给出猜测
guessCondition.signal(); // 唤醒等待猜测的线程
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
};
// 第二个线程,负责猜测
private final Runnable guesser = () -> {
lock.lock();
try {
while (target == 0) { // 如果还没有设置要猜的数字,等待
guessCondition.await();
}
while (!isOver) { // 如果双方都还没有猜对
int guess = new Random().nextInt(100) + 1; // 随机猜一个1~100之间的数
System.out.println("猜测线程猜测了:" + guess);
if (guess == target) { // 猜对了
isOver = true;
System.out.println("猜测线程猜对了!");
hintCondition.signal(); // 唤醒等待提示的线程
} else if (guess < target) { // 猜小了
System.out.println("猜测线程猜小了!");
hintCondition.signal(); // 唤醒等待提示的线程
guessCondition.await(); // 等待下次猜测
} else { // 猜大了
System.out.println("猜测线程猜大了!");
hintCondition.signal(); // 唤醒等待提示的线程
guessCondition.await(); // 等待下次猜测
}
}
guessCondition.signal(); // 唤醒可能还在等待的猜测线程
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
};
public void play() throws InterruptedException {
Thread thread1 = new Thread(setter);
Thread thread2 = new Thread(guesser);
Thread thread3 = new Thread(guesser);
thread1.start();
thread2.start();
thread3.start();
thread1.join();
thread2.join();
thread3.join();
}
public static void main(String[] args) throws InterruptedException {
GuessNumberGame game = new GuessNumberGame();
game.play();
}
}
```
这个程序中使用了一个共享锁和两个条件变量来实现线程之间的等待和唤醒。其中,第一个线程用来设置要猜的数字,第二个和第三个线程用来猜测,直到其中一个线程猜对为止,整个程序才会结束。在setter线程中,我们先生成一个1~100之间的随机整数作为要猜的数字,然后唤醒等待猜测的线程。接着我们进入一个循环,在循环中,如果双方都还没有猜对,我们就等待猜测线程给出猜测,然后唤醒等待猜测的线程。在guesser线程中,我们首先等待setter线程设置好要猜的数字,然后进入一个循环,如果双方都还没有猜对,我们就随机猜一个1~100之间的数,并根据猜测结果给出相应的提示,然后等待下一个猜测。如果猜对了,我们就将isOver标记为true,唤醒等待提示的线程,整个程序就结束了。