Использовать ScheduledExecutorService
:
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
void registerCallback() {
ses.schedule(new MyCommand(), 30, TimeUnit.SECONDS);
}
Возвращает Future
, который можно использовать для отмены выполнения, если вы хотите, иличтобы получить значение, возвращаемое MyCommand
.
Если вы хотите запланировать команду, которая будет повторяться своевременно, вы можете использовать другие методы планирования: scheduleAtFixedRate
и scheduleWithFixedDelay
.
Если вам нужно перепланировать только некоторые условия или с разными скоростями или интервалами, я использовал одну технику, чтобы передать ScheduledExecutorService
вашей команде (т. Е. new MyCommand(ses)
) и позволить ей перенести свое расписание илиновая команда с соответствующей задержкой:
class MyCommand implements Runnable {
private final ScheduledExecutorService ses;
MyCommand(ScheduledExecutorService ses) { this.ses = ses; }
private boolean shouldReschedule() { ... }
private int getRescheduleTimeoutMs() { ... }
@Override void run() {
// do work
...
// reschedule if needed
if (shouldReschedule()) {
// reschedule this command:
ses.schedule(this, getRescheduleTimeoutMs(), TimeUnit.MILLISECONDS);
// or else a new one:
ses.schedule(new MyCommand(ses), ...);
}
}
}