Вопрос-ответ

How to schedule a periodic task in Java?

Как запланировать периодическую задачу в Java?

Мне нужно запланировать выполнение задачи через фиксированный интервал времени. Как я могу это сделать с поддержкой больших интервалов (например, каждые 8 часов)?

В настоящее время я использую java.util.Timer.scheduleAtFixedRate. java.util.Timer.scheduleAtFixedRate Поддерживает большие временные интервалы?

Переведено автоматически
Ответ 1

Используйте ScheduledExecutorService:

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);
Ответ 2

Вам следует ознакомиться с Quartz - это Java-фреймворк, который работает с редакциями EE и SE и позволяет определять задания для выполнения в определенное время

Ответ 3

Попробуйте этот способ ->

Сначала создайте класс TimeTask, который запускает вашу задачу, это выглядит следующим образом:

public class CustomTask extends TimerTask  {

public CustomTask(){

//Constructor

}

public void run() {
try {

// Your task process

} catch (Exception ex) {
System.out.println("error running thread " + ex.getMessage());
}
}
}

Затем в основном классе вы создаете экземпляр задачи и запускаете ее периодически, начиная с определенной даты:

 public void runTask() {

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 40);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);



Timer time = new Timer(); // Instantiate Timer Object

// Start running the task on Monday at 15:40:00, period is set to 8 hours
// if you want to run the task immediately, set the 2nd parameter to 0
time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8));
}
Ответ 4

Используйте Google GuavaAbstractScheduledService, как указано ниже:

public class ScheduledExecutor extends AbstractScheduledService {

@Override
protected void runOneIteration() throws Exception {
System.out.println("Executing....");
}

@Override
protected Scheduler scheduler() {
return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS);
}

@Override
protected void startUp() {
System.out.println("StartUp Activity....");
}


@Override
protected void shutDown() {
System.out.println("Shutdown Activity...");
}

public static void main(String[] args) throws InterruptedException {
ScheduledExecutor se = new ScheduledExecutor();
se.startAsync();
Thread.sleep(15000);
se.stopAsync();
}
}

Если у вас есть другие подобные службы, то регистрация всех служб в ServiceManager будет полезна, поскольку все службы можно запускать и останавливать вместе. Подробнее о ServiceManager читайте здесь.

java