В коде переменный таймер будет указывать продолжительность, по истечении которой цикл while будет завершен, например 60 секунд.
while(timer) {
//run
//terminate after 60 sec
}
В коде переменный таймер будет указывать продолжительность, по истечении которой цикл while будет завершен, например 60 секунд.
while(timer) {
//run
//terminate after 60 sec
}
вам следует попробовать новые службы Java Executor Services. 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();
}
}
}
Thread.sleep(1337);
?
- person Murmel; 07.09.2016
Если вы не можете превысить свой временной лимит (это жесткий лимит), то ветка - ваш лучший выбор. Вы можете использовать цикл для завершения потока после достижения порогового значения времени. Все, что происходит в этом потоке в данный момент, может быть прервано, что позволяет почти мгновенно останавливать вычисления. Вот пример:
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's OK
}
}
t.interrupt(); // Tell the thread to stop
t.join(); // Wait for the thread to cleanup and finish
Это даст вам разрешение около 1/2 секунды. Вы можете решить эту проблему, если чаще будете опрашивать в цикле while.
Запуск вашего runnable будет выглядеть примерно так:
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, который вы настроили, позаботится о прерывании потока. Это позволит вам получить более точное разрешение без циклического опроса.
.interrupt()
работает не так. Если поток не заблокирован, он просто устанавливает флаг interrupted
, поток все равно должен проверить его, чтобы остановить выполнение. Кроме того, InterruptedException
- это проверенное исключение, вы не можете просто выбросить его вокруг произвольного кода (ваш пример не будет компилироваться).
- person Dmitri; 23.11.2010
Зависит от того, что делает цикл while. Если есть вероятность, что он будет блокироваться на долгое время, используйте TimerTask
, чтобы запланировать задачу, чтобы установить stopExecution
флаг, а также .interrupt()
ваш поток.
Имея в цикле только временное условие, он может вечно ждать ввода или блокировки (опять же, это может не быть проблемой для вас).
start
и end
- абсолютные времена, измеряемые в миллисекундах с начала эпохи (полночь, 1 января 1970 г. по всемирному координированному времени). Ролловера нет.
- person Matt Ball; 23.11.2010