Приостановка цикла for в Java - PullRequest
4 голосов
/ 12 декабря 2011

Есть ли способ приостановить цикл for в Java?Так есть ли способ перейти только на одну итерацию при появлении запроса?Я прочитал это http://answers.yahoo.com/question/index?qid=20100212201605AAazS73, и кажется, что решение может иметь некоторые проблемы, в основном потому, что я не до конца понимаю порядок, в котором цикл for проверяет свой заголовок.Единственный способ, который я мог бы придумать, чтобы добиться чего-то похожего, это следующий

    do {
        if (FLAG) {
            //Do procedure
            i++;
            FLAG = false;
        }
    } while ( i < 6);

Когда флаг установлен в true, процедура выполняется, и счетчик перемещается на один.Однако мне это не нравится, потому что оно будет продолжать работать до тех пор, пока счетчик будет ниже 6, если я не ошибаюсь.Есть идеи?

-Извините за отсутствие ясности.FLAG в моем случае будет статическим логическим значением, которое может быть вызвано из другого класса.Процедура, на которую я ссылаюсь, зависит от меня.

Ответы [ 6 ]

3 голосов
/ 12 декабря 2011

При переборе цикла for, например, приведенного ниже, он делает следующее

for (int i = 0; i < 6; i++) {
    // Do stuff
}
  1. Объявляет переменную i и присваивает значение 0.
  2. Проверяет условное i < 6. Если значение равно true, перейдите к шагу 3. В противном случае перейдите к шагу 6. ​​
  3. Проходит через тело цикла.
  4. Увеличить переменную i из-за i++ в заголовке цикла for.
  5. Перейти к шагу 2.
  6. Цикл заканчивается.

Что касается вашей цели, я не уверен, какова ваша цель. Вы хотите сделать паузу с помощью вызова метода блокировки? Если так, то что-то вроде этого будет работать:

for (int i = 0; i < 6; i++) {
    System.in.readLine();
}

В качестве альтернативы, вы можете использовать какой-нибудь флаг, который опрашивает, чтобы проверить, должен ли цикл продолжаться, например:

for (int i = 0; i < 6; i++) {
    while (paused) {
        // An infinite loop that keeps on going until the pause flag is set to false
    }
}

Надеюсь, это помогло.

2 голосов
/ 12 декабря 2011

Непонятно, что за «подсказку» вы имеете в виду. Конечно, вы можете сделать что-то вроде:

for (int i = 0; i < 6; i++) {
    System.out.println("Press return to continue...");
    System.in.readLine();

    // Do the body of the loop
}

Это подходит для консольного приложения, но, очевидно, не для (скажем) приложения Swing. Это также не относится к части FLAG вашего примера кода, потому что не ясно, что это значит. Вы пытаетесь запросить у пользователя дополнительную информацию или просто подтверждение для продолжения? Если бы вы могли уточнить, чего вы пытаетесь достичь, это действительно помогло бы.

Ради тестируемости, если это не одноразовый код, вы можете извлечь идею пользовательского приглашения, чтобы вы могли протестировать его с реализацией, которая не фактически запрашивает пользователя , но просто записывает, что это было бы так.

0 голосов
/ 12 декабря 2011

Другие рассказывали, как использовать System.in.readLine(), чтобы программа явно требовала действий от пользователя.

Если вам нужно не заставить программу ждать пользователя, а позволить вам - программисту- чтобы замедлить работу программы, чтобы иметь возможность найти и исправить ошибку, вы можете рассмотреть возможность использования отладчика, поскольку это именно то, для чего она предназначена.

В любой современной Java IDE есть отладчик,Ключи, выбранные для его использования, просто различаются.

Если вы используете Eclipse, вы используете либо F11, либо Ctrl-F11 (при условии Windows) для запуска вашей программы.Разница в том, что F11 запускает вашу программу внутри отладчика, а Ctrl-F11 - нет.

Поместите курсор на первую строку внутри цикла for и выберите Run-> Toggle Breakpoint.Синяя пуля покажет слева от линии.Это означает, что точка останова активна - теперь отладчик будет останавливать вашу программу каждый раз, когда достигает этой строки.

Теперь запустите вашу программу в отладчике с помощью F11.Программа останавливается на линии, и вы можете при необходимости исследовать свои переменные на панели «Переменные» и продолжать выполнение с F8, когда будете готовы.

0 голосов
/ 12 декабря 2011

Ну, вы могли бы использовать Thread.Sleep();, чтобы сделать небольшую паузу между проверками флагов, но на самом деле вы ищете функцию, которая блокирует при ожидании ввода, System.in.readline(); блокирует, если я правильно помню;):

int i = 0
do 
{
    if(FLAG) 
    {
        //Do stuff
        i++;
        //Clear Flag
    }

    Thread.Sleep(50); //Sleep for 50 ms

} while (i < 6);

или примерно так:

for(int i = 0; i < 6; i++) //Execute readline 6 times.
{
    System.in.readLine();
}
0 голосов
/ 12 декабря 2011

Ваша цель несколько неясна. Я думаю, что вы хотите, чтобы ваша программа продолжала работать до тех пор, пока вы не получите шесть из определенных входных данных, и если это так, этот подход будет работать, хотя, конечно, вам потребуется получить от пользователя входные данные, чтобы продвинуть цикл вперед.

Если вы обеспокоены тем, что цикл while будет использовать много системных ресурсов, это не будет проблемой.

0 голосов
/ 12 декабря 2011

Это будет включать блокировку Thread, который занимает цикл for.

Вы можете сделать это просто, но не очень хорошо, с помощью этого:

for(something)
  while(!FLAG)
    //Do procedure

Другим способом было бы запустить еще один Thread и заставить основной поток ожидать этот другой поток.

Вот еще немного информации: Как заставить поток Java ожидать вывода другого потока?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...