Как выйти из цикла while через определенное время? - программирование

Как выйти из цикла while через определенное время?

У меня есть цикл while, и я хочу, чтобы он выходил через некоторое время.

Например:

while(condition and 10 sec has not passed){

}
4b9b3361

Ответ 1

long startTime = System.currentTimeMillis(); //fetch starting time
while(false||(System.currentTimeMillis()-startTime)<10000)
{
    // do something
}

Таким образом, утверждение

(System.currentTimeMillis()-startTime)<10000

Проверяет, прошло ли 10 секунд или 10 000 миллисекунд с момента запуска цикла.

ИЗМЕНИТЬ

Как отметил @Julien, это может завершиться неудачно, если ваш кодовый блок внутри цикла while занимает много времени. Таким образом, используя ExecutorService будет хорошим вариантом.

Сначала нам нужно было бы запустить Runnable

class MyTask implements Runnable
{
    public void run() { 
        // add your code here
    }
}

Затем мы можем использовать ExecutorService, как это,

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new MyTask()), 10, TimeUnit.SECONDS); // Timeout of 10 seconds.
executor.shutdown();

Ответ 2

Предлагаемые и принятые решения не будут делать трюк.

Он не остановит цикл через 10 секунд. Представьте, что код в вашем цикле занимает 20 секунд для обработки и вызывается через 9,9 секунды. Ваш код выйдет после 29.9 секунд выполнения.

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

Существующие решения уже были предложены здесь и там

Ответ 3

Что-то вроде:

long start_time = System.currentTimeMillis();
long wait_time = 10000;
long end_time = start_time + wait_time;

while (System.currentTimeMillis() < end_time) {
   //..
}

Должен сделать трюк. Если вам нужны другие условия, просто добавьте их в оператор while.

Ответ 4

Не используйте этот

System.currentTimeMillis()-startTime

Это может привести к зависанию при изменении времени машинной машины. Лучше использовать этот способ:

Integer i = 0;
            try {
                while (condition && i++ < 100) {
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

(100 * 100 = тайм-аут 10 с)