Привет, ребята У меня есть вложенный поток и его использование, чтобы посмотреть, когда игрок совершил поворот (в черновике). O имеет игровой объект и переменную public changedTurns ,Thread, while loop и оператор System.out.print
new Thread() {
public void run(){
check();
}
private void check(){
boolean sent = false;
while(true){
System.out.println("ee"); \\line 9
if(game.changedTurns){
System.out.println("gg");
if(!sent){
System.out.println("ok");
sent =true;
}
}
}
}.start();
Все работает, как и ожидалось, как и выше Ie консоли показывает много «ЭИ», а затем «гг», а затем «ОК», когда игрок берет свою очередь, однако без линии 9 ничего не отображается, когда игрок берет их очередь ?!
Попробуйте распечатать значение game.changedTurns. Если ничего не печатается, это означает, что оно ложно. – anon
Поле 'changedTurns' объявлено [' volatile'] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.4)? Если нет, поток [разрешен спецификацией языка Java] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.3) для оптимизации выполнения путем изучения значение changedTurns только один раз. – VGR
Печать в stdout занимает некоторое время, когда вы удаляете эту строку, что может происходить, цикл 'while (true)' постоянно перебирается, что может помешать другому потоку когда-либо делать то, что он делает, game.changedTurns'. Вы должны иметь возможность заменить оператор печати (короткий) сон и заставить его работать по своему желанию. Тем не менее, было бы гораздо лучше реорганизовать код, который будет управляться событиями, а не бесконечный цикл, постоянно проверяющий что-то. – Exupery