Java 使用ScheduledExecutorService的计划任务?好主意?

Java 使用ScheduledExecutorService的计划任务?好主意?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我需要每天执行一些任务。我可以为此使用ScheduledExecutorService吗?假设一段代码总是以特定的间隔运行。我怀疑我总是让CPU忙着运行我的代码,但这段代码将在一天、一周或一个月内运行我的实际任务一次,具体取决于配置 ScheduledExecutorService schedular = Executors.newScheduledThreadPool(1); schedular.scheduleAtFixedRate(new MySchedular(), 1, 24, Tim

我需要每天执行一些任务。我可以为此使用ScheduledExecutorService吗?假设一段代码总是以特定的间隔运行。我怀疑我总是让CPU忙着运行我的代码,但这段代码将在一天、一周或一个月内运行我的实际任务一次,具体取决于配置

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

< P > >我们有更好的选择吗?

对于一个非常基本的需求,你确实可以像你那样使用<代码> StuteDeCuto Service < /代码>,但是如果你想做复杂的事情,比如在一天中给定的时间调度你的任务,你应该考虑使用.< /P> 以下是如何在晚上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();
使用创建的相同触发器将是:

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

考虑到您正在使用Windows且CronJob不可用,ScheduledExecutorService是您的一个非常好的选择。您需要研究的唯一问题是,如果进程因任何原因而终止,而不是由于Windows重新启动,会发生什么情况。通常,关键系统具有某种看门狗进程,可以监视您的进程,并在进程终止时重新启动它。但这可能超出了这个问题的范围。简而言之,您的问题的答案是:ScheduledExecutorService是正确的选择。

担心的不是CPU会很忙,因为当代码只是等待(一个月)的计时器时,进程应该休眠。更大的问题来自于进程结束(例如,机器重新启动),而没有任何东西可以重新启动它。不同的系统有不同的机制来执行这些交互任务,*NIX有
cron
,但是我不知道你的系统。你使用哪个版本的Java?你使用哪个操作系统?如果你使用Linux,那么CronJob将是最好的选择一切都由cron job完成你只需要给出想要执行的脚本路径…@msw-我使用的是windows 7,在windows中所有.bat文件在机器启动/登录时执行(如果您将它放在C:\Users\\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)…Windows触发触发java代码的.bat文件。无需手动触发。我从ScheduledExecutorService了解到,JVM在内存中的某个位置注册下一次执行时间,并在该时间到来时维护它(JVM)执行它的任务并并行地更新内存中的下一次执行时间。这个循环一直持续到我们的程序终止。因此,看起来CPU正忙于我们的程序,但实际上并非如此。实际上,
ScheduledExecutorService
不会消耗太多CPU,但是,如果您希望能够调度,只有您的任务会消耗我在回答中提到的CPU在固定时间执行任务时,您将需要自己实现逻辑,
ScheduledExecutorService
无法单独完成此任务。