这是一个“猜测10秒游戏中的数字”,循环直到用户希望程序停止(游戏无限期重新开始,或直到用户键入“退出”)。 问题是,如果一回合失败(超时),然后用户打印正确的答案,游戏说它赢了。这意味着,最后一场比赛(回合)的线程没有中断。下面是类:如何完全停止包含缓冲读取器的线程?
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import static java.lang.Math.abs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Initializer extends Thread {
@Override
public void run() {
Random rand = new Random();
int x = (abs(rand.nextInt())) % 101;
GameEngine gameEngine = new GameEngine(x);
gameEngine.start();
synchronized (this) {
try {
wait(10000);
} catch (InterruptedException ex) {
Logger.getLogger(Initializer.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (gameEngine.isAlive()) {
gameEngine.interrupt();
System.out.println("Time is up! The number was " + x);
}
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(Initializer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public class GameEngine extends Thread {
private final int valueToGuess;
public GameEngine(int x) {
this.valueToGuess = x;
}
@Override
@SuppressWarnings("ConvertToTryWithResources")
public synchronized void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
try {
int x;
String line = br.readLine();
if(line.equalsIgnoreCase("exit")) System.exit(0);
try {
x = Integer.parseInt(line);
} catch (NumberFormatException e) {
System.out.println("Please enter a number!");
continue;
}
if (x < valueToGuess) {
System.out.println("Too low!");
}
if (x > valueToGuess) {
System.out.println("Too high!!");
}
if (x == valueToGuess) {
System.out.println("You won!");
break;
}
} catch (IOException ex) {
Logger.getLogger(GameEngine.class.getName()).log(Level.SEVERE, null, ex);
}
}
try {
br.close();
} catch (IOException ex) {
Logger.getLogger(GameEngine.class.getName()).log(Level.SEVERE, null, ex);
}
this.notifyAll();
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
System.out.println("Guess the number!");
Initializer counter = new Initializer();
counter.start();
while (true) {
if(counter.isAlive()) continue;
System.out.println("Game starts in:");
Thread.sleep(1000);
System.out.println("5");
Thread.sleep(1000);
System.out.println("4");
Thread.sleep(1000);
System.out.println("3");
Thread.sleep(1000);
System.out.println("2");
Thread.sleep(1000);
System.out.println("1");
Thread.sleep(1000);
System.out.println("Guess the number!");
counter = new Initializer();
counter.start();
}
}
}
所以,如果我跑了,考虑到价值猜测是50,和我不圆,当在下一轮开始,如果我输入50,我得到“你赢了! “从上一轮开始,然后从当前回合出现“错误”。我选择了BufferedReader而不是Scanner,因为我读了Scanner.nextLine()阻塞了线程,使其不会中断,而BufferedReader不会阻塞它。问题必须是当我通知初始化程序线程中断GameEngine线程时。我是多线程新手,因此它必须是所有同步或等待/通知指令的错误。请帮忙吗?
不应该是'gameEngine.wait(10000);'?您正在等待并通知不同的对象... – 1000ml
初始化程序应等待10秒钟,如果GameEngine获胜,则通知GameEngine,否则,在这10秒钟后,初始化程序应中断GameEngine。所以我猜不,Initializer等待10秒钟才会收到通知,否则会停止GameEngine。 – Andrew
'this.notifyAll();'这不会通知任何事情,因为GameEngine对象上没有任何东西在等待。 – 1000ml