2014-01-14 5 views
5

У меня есть программа, которая работает одновременно и у меня есть эта проблема, когда я хочу, чтобы остановить поток, но цикл/пока цикл не отменен один раз я когда-то я нажимаю войтиДля и While Loop

Если я возьмите петлю for из цикла while, программа фактически реагирует на ввод и завершает работу.

class MyNumber extends Thread { 

    private volatile boolean processing = true; 

    public void run() { 
     while (processing) { 
      // Once I take this for loop out(put // beside it like right now), the enter key to stop the program then does work. 
      //for(int i = 1; i<27; i++){ 
      System.out.println("Letter " + "i"); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      // } 
     } 
    } 

    public void permSleep() { 
     processing = false; 
    } 
} 

public class LetterNumber { 
    public static void main(String[] args) { 
     MyNumber num1 = new MyNumber(); 
     num1.start(); 

     System.out.println("Hit enter to stop the Numbers!"); 
     Scanner shutter1 = new Scanner(System.in); 
     shutter1.nextLine(); 

     num1.permSleep(); 
    } 
} 

Почему петля for заставляют программу не остановки?

+0

Btw, он не должен был говорить пока (обработка == true), но только пока (обработка). Кроме того, если цикл while не прерывается, один раз вводится что-то в консоли из-за вызова метода permSleep, который делает обработку переменной == false? – JavaNewb

+0

Это собирается печатать «Letter i» раз в секунду, на неопределенный срок. –

ответ

2

Я не совсем понимаю, о чем вы спрашиваете. Однако, если вы ожидаете, что петли оба завершатся, как только processing установлено в true, это не то, что происходит. while выполнит оператор в теле (т.е. for петли), затем будет проверить условие (processing == true), а затем, если это правда, он снова выполняет оператор, а затем снова проверяет условие. Он не проверяет его, пока выполняется цикл for. Он не «заметит», когда установлена ​​переменная processing. Поэтому, когда processing установлен в true, цикл for будет продолжаться до тех пор, пока он не будет выполнен, что может быть еще 26 секунд.

Чтобы исправить это просто добавьте

if (!processing) 
    break; 

внутри цикла for. Теперь флаг processing будет проверяться каждый раз через цикл for. (Если бы это было, я бы поставил «ярлык» на петле while и использовать, чтобы break из обеих петель). Еще один способ это исправить:

for(int i = 1; i<27 && processing; i++){ 

, который означает, что цикл for будет продолжаться только до тех пор, пока processing - true.

Примечание: Эти решения все еще не проведут проверку processing, пока продолжается sleep(1000). Таким образом, программа может приостановить работу до 1 секунды, прежде чем она завершится. Если вы действительно хотите решение, которое закончит sleep, у вас будет interrupt или какая-либо другая функция параллелизма.

+2

Вы не имеете в виду 'if (! Processing)'? –

+0

Да, спасибо .... – ajb

+0

Действительно объяснил это полностью и устранил проблему.Спасибо, кучка @HotLicks, я понял, что тоже и просто положил (обработка == false) – JavaNewb

1

Должно работать. Ваша петля for занимает около 27 секунд. Это должно произойти после завершения цикла for.

+2

Да, цикл for работает отлично, это просто, когда я нажимаю Enter и вводим его в консоль, поток не останавливается так, как должен. Я попытался вынуть цикл for и заметить, что теперь поток останавливается при вводе «enter». – JavaNewb

+0

Вы подождали некоторое время? – fastcodejava