Подтвердить что ты не робот

Как остановить выполнение через определенное время в Java?

В коде таймер переменной будет указывать продолжительность, по истечении которой, например, конец цикла составляет 60 секунд.

   while(timer) {
    //run
    //terminate after 60 sec
   }
4b9b3361

Ответ 1

long start = System.currentTimeMillis();
long end = start + 60*1000; // 60 seconds * 1000 ms/sec
while (System.currentTimeMillis() < end)
{
    // run
}

Ответ 2

вам следует попробовать новые службы Java Executor. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

При этом вам не нужно программировать цикл измерения времени самостоятельно.

public class Starter {

    public static void main(final String[] args) {
        final ExecutorService service = Executors.newSingleThreadExecutor();

        try {
            final Future<Object> f = service.submit(() -> {
                // Do you long running calculation here
                Thread.sleep(1337); // Simulate some delay
                return "42";
            });

            System.out.println(f.get(1, TimeUnit.SECONDS));
        } catch (final TimeoutException e) {
            System.err.println("Calculation took to long");
        } catch (final Exception e) {
            throw new RuntimeException(e);
        } finally {
            service.shutdown();
        }
    }
}

Ответ 3

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

Thread t = new Thread(myRunnable); // myRunnable does your calculations

long startTime = System.currentTimeMillis();
long endTime = startTime + 60000L;

t.start(); // Kick off calculations

while (System.currentTimeMillis() < endTime) {
    // Still within time theshold, wait a little longer
    try {
         Thread.sleep(500L);  // Sleep 1/2 second
    } catch (InterruptedException e) {
         // Someone woke us up during sleep, that OK
    }
}

t.interrupt();  // Tell the thread to stop
t.join();       // Wait for the thread to cleanup and finish

Это даст вам разрешение примерно на 1/2 секунды. При частом опросе в цикле while вы можете получить это.

Ваш runnable run будет выглядеть примерно так:

public void run() {
    while (true) {
        try {
            // Long running work
            calculateMassOfUniverse();
        } catch (InterruptedException e) {
            // We were signaled, clean things up
            cleanupStuff();
            break;           // Leave the loop, thread will exit
    }
}

Обновление, основанное на ответе Дмитрия

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

Ответ 4

Зависит от того, что делает цикл while. Если есть вероятность, что он будет блокироваться в течение длительного времени, используйте TimerTask, чтобы запланировать задачу, чтобы установить флаг stopExecution, а также .interrupt() ваш поток.

С условием времени в цикле он может сидеть там навсегда, ожидая ввода или блокировки (опять же, может быть, не проблема для вас).