用两个线程玩猜数子游戏,第一一个线程负责随机给出1~100的一个整数,第二个线程负责猜出这个数。要求每当第二个线程给出自己的猜测后,第一个线程都会提示“猜小了”“猜大了”或“猜对了”。猜数之前,要求第二个线程要等待第一个线程设置好要猜测的数。
第一个线程设置好猜测数之后,两个线程还要互相等待,其原则是:第二个线程给出自己的猜测后,等待第一个线程给出提示;第一个线程给出提示后,等待第二个线程给出猜测,如此进行,直到第二个线程给出正确的猜测后,两个线程进人死亡状态。
这是课本实验要求,但是我看以了一下它给出的代码,真的真的是太迷了,课本直接把猜数和给数两个线程写到一个类里面了,我不知道这样的用意是什么。我猜可能是为什么方便传递参数,但是其实传递参数的方法有很多种,没必要这样做。课本代码:
package com.hj.Thread;
/**
* @author piki
*/
public class Number implements Runnable {
private final int SMALLER = -1;
private final int SUCCESS = 0;
private final int lARGER = 1;
private int realNumber, guessNumber, min = 0, max = 100, message = SMALLER;
private boolean pleaseGuess = false, isGiveNumber = false;
Thread giveNumberThread,guessNumberThread;
Number() {
giveNumberThread = new Thread(this);
guessNumberThread = new Thread(this);
}
@Override
public void run() {
for (int count = 1; true; count++) {
setMessage(count);
if (message == SUCCESS) {
return;
}
}
}
private synchronized void setMessage(int count){
if (Thread.currentThread() == giveNumberThread && !isGiveNumber){
realNumber = (int)(Math.random()*100) + 1;
System.out.println("随机给你一个1到100的数,猜猜是多少?");
System.out.println("外挂:"+realNumber);
isGiveNumber = true;
pleaseGuess = true;
}
if (Thread.currentThread() == giveNumberThread) {
while (pleaseGuess){
try {
wait();
} catch (InterruptedException ignored) {
}
}
if ( guessNumber < realNumber){
message = SMALLER;
System.out.println("你猜小了");
}
else if(guessNumber > realNumber){
message = lARGER;
System.out.println("你猜大了");
}
else {
message = SUCCESS;
System.out.println("恭喜,你猜对了");
}
pleaseGuess = true;
}
if (Thread.currentThread() == guessNumberThread && isGiveNumber){
while (!pleaseGuess) {
try {
wait();
}
catch (InterruptedException ignored){}
}
if (message == SMALLER) {
min = guessNumber;
guessNumber = (min + max) / 2;
System.out.println("我第" + count + "次猜这个数是:" + guessNumber);
}
else if (message == lARGER) {
max = guessNumber;
guessNumber = (min + max) / 2;
System.out.println("我第" + count + "次猜这个数是:" + guessNumber);
}
pleaseGuess = false;
}
notifyAll();
}
}
package com.hj.Thread;
/**
* @author piki
*/
public class TwoThreadGuessNumber {
public static void main(String[] args) {
Number number = new Number();
number.giveNumberThread.start();
number.guessNumberThread.start();
}
}
运行结果: