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