Reputation: 4879
I would like to be able to schedule a task at a specific time in Java. I understand that the ExecutorService
has the ability to schedule at periodic intervals, and after a specified delay, but I am looking more for a time of day as opposed to after a duration.
Is there a way to have, say, a Runnable
execute at 2:00, or do I need to calculate the time between now and 2:00, and then schedule the runnable to execute after that delay?
Upvotes: 6
Views: 14480
Reputation: 3698
Got myself on this situation this morning... This was my code to run at midnight
scheduler = Executors.newScheduledThreadPool(1);
Long midnight=LocalDateTime.now().until(LocalDate.now().plusDays(1).atStartOfDay(), ChronoUnit.MINUTES);
scheduler.scheduleAtFixedRate(this, midnight, 1440, TimeUnit.MINUTES);
Upvotes: 2
Reputation: 361
this is how I've solved it using java7SE:
timer = new Timer("Timer", true);
Calendar cr = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cr.setTimeInMillis(System.currentTimeMillis());
long day = TimeUnit.DAYS.toMillis(1);
//Pay attention - Calendar.HOUR_OF_DAY for 24h day model
//(Calendar.HOUR is 12h model, with p.m. a.m. )
cr.set(Calendar.HOUR_OF_DAY, it.getHours());
cr.set(Calendar.MINUTE, it.getMinutes());
long delay = cr.getTimeInMillis() - System.currentTimeMillis();
//insurance for case then time of task is before time of schedule
long adjustedDelay = (delay > 0 ? delay : day + delay);
timer.scheduleAtFixedRate(new StartReportTimerTask(it), adjustedDelay, day);
//you can use this schedule instead is sure your time is after current time
//timer.scheduleAtFixedRate(new StartReportTimerTask(it), cr.getTime(), day);
it happens to be trickier than I thought to do it correctly
Upvotes: 6
Reputation: 7722
you can use spring annotations too
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html
Upvotes: 7
Reputation: 115398
user java.util.Timer
. It has method new schedule(task, time)
where time is a Date when you want to execute the task once.
Upvotes: 0
Reputation: 28346
Check out Quartz. We use it for our production apps, and it's very good. It works pretty much like crontab. You can specify a time during a set schedule and it'll execute a callback at that time.
Upvotes: 0