2013-12-01 4 views
0

Привет, ребята У меня есть вложенный поток и его использование, чтобы посмотреть, когда игрок совершил поворот (в черновике). 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 ничего не отображается, когда игрок берет их очередь ?!

+1

Попробуйте распечатать значение game.changedTurns. Если ничего не печатается, это означает, что оно ложно. – anon

+1

Поле '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

+0

Печать в stdout занимает некоторое время, когда вы удаляете эту строку, что может происходить, цикл 'while (true)' постоянно перебирается, что может помешать другому потоку когда-либо делать то, что он делает, game.changedTurns'. Вы должны иметь возможность заменить оператор печати (короткий) сон и заставить его работать по своему желанию. Тем не менее, было бы гораздо лучше реорганизовать код, который будет управляться событиями, а не бесконечный цикл, постоянно проверяющий что-то. – Exupery

ответ

0

Вам не нужно использовать потоки, чтобы проанализировать, прошел ли игрок на повороте. Просто создайте массив Player [] и добавьте поворот переменной для индекса игрока, чей ход. Приращение при повороте игрока.