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

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

например:

while(condition and 10 sec has not passed){

}

4 ответов


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();

предлагаемые и принятые решения не сделают трюк.

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

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

существующие решения уже предлагались здесь и здесь


что-то типа:

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

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

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


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

System.currentTimeMillis()-startTime

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

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

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