Получаете ли вы NullPointerException
?
Я проверил ваше решение, и вот что я получил.В этом случае ваша проблема заключается в том, что вы пытаетесь инициализировать поле game
в Timer
до инициализации статического свойства в классе Main
.
Ради вашего понимания позвольте мнеперефразируя это: Когда ваш код запускает
private Thread game = Main.game;
, в Main.game
ничего нет, и это потому, что Main.game
будет инициализирован после инициализации экземпляров Start
и Timer
.
Самый простой способ решить эту проблему - удалить свойство private Thread game
вашего таймера и просто вызвать Main.game.interrupt();
Edit 01: Как только вы решите первое, вам нужнопонять, как работает прерывание потока.Когда вы звоните Main.game.interrupt();
, вы немедленно остановите его, только если поток спит.Если это так, поток выдаст InterruptedException
, но это не то, что мы хотим, и я бы не рекомендовал это.В обычном потоке выполнение метода .interrupt()
установит состояние целевого потока как «Прервано», но это только флаг boolean
, который ничего не меняет (пока).Что вам нужно сделать, это проверить состояние этого флага в вашем методе рекурсии, чтобы, когда значение флага «прерывание» было равно true, вы изменили значение isPlaying
на false.И вот как ваш поток остановится.
В коде это будет примерно так:
public void play() throws IOException {
...
timerThread.run();
System.out.print("Enter a letter: ");
char input = sc.next().toUpperCase().charAt(0);
if (Thread.interrupted()) {
System.out.println("I should interrupt myself! ;)");
isPlaying = false;
}
...
if(isPlaying) play();
}
Надеюсь, это поможет:)