У меня есть цикл while, и я хочу, чтобы он выходил через некоторое время.
Например:
while(condition and 10 sec has not passed){
}
У меня есть цикл while, и я хочу, чтобы он выходил через некоторое время.
Например:
while(condition and 10 sec has not passed){
}
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 с)