package practice12;
/**
* @Author: HuDaoquan
* @Description: TODO
* @Email: hudaoquan@enn.cn
* @Date: 2020-6-20 1:01
* @Version 1.0
*/
public class Number implements Runnable {
final int SMALLER = -1, LARGER = 1, SUCCESS = 888;
int realNumber, guessNumber, min = 0, max = 100, message = SMALLER;
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; count < 10; count++) {
System.err.println(count + " ? " + message + Thread.currentThread().getName());
setMessage(count);
if (message == SUCCESS) {
return;
} else {
continue;
}
}
}
public synchronized void setMessage(int count) {
if (Thread.currentThread() == giveNumberThread && isGiveNumber == false) {
realNumber = (int) (Math.random() * 100 + 1);
System.out.println("我在心裏想了壹個1-100的數,妳猜猜看,它是多少?====" + realNumber);
isGiveNumber = true;
// 讓下面的判斷語句執行猜線程
pleaseGuess = true;
}
if (Thread.currentThread() == giveNumberThread && isGiveNumber == true) {
//pleaseGuess為true,調用猜線程,猜線程將pleaseGuess置為false,結束循環,也就是在此調用猜線程
while (pleaseGuess == true) {
try {
wait();
// 猜線程執行完,猜線程將pleaseGuess置為false,下壹次循環退出while,執行後續if語句
} catch (InterruptedException e) {
}
}
// 調用完壹次猜,開始判斷猜的結果並給出message信息
if (realNumber > guessNumber) {
message = SMALLER;
System.out.println(guessNumber + "妳猜小了,大點試試!");
} else if (realNumber < guessNumber) {
message = LARGER;
System.out.println(guessNumber + "妳猜大了,小點試試");
} else {
message = SUCCESS;
System.out.println(guessNumber + "太棒啦,妳猜對了呢");
}
// 給完信息,將pleaseGuess置為true,給猜線程調用的時候退出wait;也就是開始猜
pleaseGuess = true;
}
if (Thread.currentThread() == guessNumberThread && isGiveNumber == true) {
// 讀到猜線程為false,則調用wait,停止猜,調用給線程
while (pleaseGuess == false) {
try {
wait();
// 給線程執行完會將pleaseGuess置為true,此處下壹次循環即會結束wait調用,執行後續語句
} catch (InterruptedException e) {
}
}
// 開始猜
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();
}
public static void main(String[] args) {
Number number = new Number();
number.giveNumberThread.start();
number.guessNumberThread.start();
}
}
代碼截圖
運行結果