2016-10-25 21 views
2

我需要每天执行一些任务。我可以为此使用ScheduledExecutorService吗?说一段总是以特定间隔运行的代码。我怀疑我忙于CPU总是在运行我的代码,但是这个代码将在一天,一周或一个月内运行我的实际任务取决于配置。使用ScheduledExecutorService的计划任务?一个好主意?

ScheduledExecutorService schedular = Executors.newScheduledThreadPool(1); 
schedular.scheduleAtFixedRate(new MySchedular(), 1, 24, TimeUnit.HOUR); 

或者我们有更好的选择吗?

+0

担心的不是CPU会忙,因为当代码正在等待一个(长达一个月的)定时器时,进程应该休眠。更大的问题来自于流程结束(例如,机器重新启动)并且没有任何可以重新启动的问题。不同的系统有不同的机制来处理这些交错的任务,* nixs有'cron',但我不知道你的系统。 – msw

+0

您使用哪个版本的Java? –

+0

你使用哪个操作系统? –

回答

1

对于非常基本的需求,您确实可以像使用ScheduledExecutorService一样使用,但如果您想在一天中的某个特定时间执行复杂任务,例如计划任务,则应考虑使用quartz-scheduler

下面是如何在晚上10点计划任务:

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

JobDetail job = JobBuilder.newJob(MySchedular.class) 
    .withIdentity("job1", "group1") 
    .build(); 

Trigger trigger = TriggerBuilder.newTrigger() 
    .withIdentity("trigger1", "group1") 
    .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(22, 00)) 
    .build(); 

// Tell quartz to schedule the job using our trigger 
scheduler.scheduleJob(job, trigger); 
// and start it off 
scheduler.start(); 

cron expression创建的同一个触发器将是:

Trigger trigger = TriggerBuilder.newTrigger() 
    .withIdentity("trigger3", "group1") 
    .withSchedule(CronScheduleBuilder.cronSchedule("0 22 00 * * ?")) 
    .build(); 
+0

我从ScheduledExecutorService中了解到,JVM将其下一个执行时间注册到内存中的某个位置并进行维护,每当它出现时(JVM)执行其任务并且并行地更新内存中的下一个执行时间。然后循环继续,直到我们的程序终止。所以它看起来像CPU忙于我们的程序,但事实上并非如此。 – user6941347

+0

确实'ScheduledExecutorService'不会消耗太多的CPU,只有你的任务将会是 –

+0

然而正如我的回答中所提到的,如果你想能够在一个固定的时间安排任务,你需要自己实现逻辑,'ScheduledExecutorService '不能独自完成。 –

0

考虑到您使用的是Windows和的cronjob不可用ScheduledExecutorService是您的一个非常好的选择。您需要研究的唯一问题是,如果出于某种原因导致进程终止,而不是由于Windows重新启动,会发生什么情况。通常,关键系统都有一些监视程序进程,用于监视进程并在其终止时重新启动进程。但这可能超出了这个问题的范围。总之,您的问题的答案是:ScheduledExecutorService是正确的选择。

相关问题