2016-10-25 55 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是正確的選擇。

相關問題