我試圖讓函數每天都被調用。現在我的代碼如下:試圖每24小時調用一次函數
do {
Thread.sleep(1000*60*60*24);
readInFile();
} while (true);
的問題是,它被稱爲每天再加上它需要執行功能readInFile
的時間。有沒有辦法做回調或每24小時都會關閉的東西?
我試圖讓函數每天都被調用。現在我的代碼如下:試圖每24小時調用一次函數
do {
Thread.sleep(1000*60*60*24);
readInFile();
} while (true);
的問題是,它被稱爲每天再加上它需要執行功能readInFile
的時間。有沒有辦法做回調或每24小時都會關閉的東西?
你可以試試這個:
Timer timer = new Timer();
TimerTask t = new TimerTask() {
@Override
public void run() {
// some code
}
};
timer.schedule (t, 0l, 1000*60*60*24);
否則你可以使用ScheduledExecutorService
一個ExecutorService,可安排的命令給定的 延遲後運行或定期地執行。
這不會比睡眠呼叫更好。 –
's/schedule/scheduleAtFixedRate /' – zapl
@MartinJames: - Hmm..ScheduledExecutorService會做的。 Tunaki已經擊中了它。 –
您可以使用ScheduledExecutorService.scheduleAtFixedRate
方法以固定速率調用Runnable
。
示例代碼來調用每一天(無初始延遲)可運行:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(myRunnable, 0, 1, TimeUnit.DAYS);
在過去,我已經做這種類型的事情與Windows任務調度和Unix cron作業。
您可以使用Quartz或Spring等調度程序將代碼設置爲每天運行一次。
春 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html
http://spring.io/guides/gs/scheduling-tasks/
//1:01 am every day
@Scheduled(cron = "0 1 1 * * ?")
public void readDaily() {
readInFile();
}
石英 https://quartz-scheduler.org
JobDetail job = new JobDetail();
job.setName("dummyJobName");
job.setJobClass(HelloJob.class);
//configure the scheduler time
Trigger trigger = new CronTrigger("trigger1", "group1");
trigger.setCronExpression("0 0 15 * * ?"); //3pm every day
//schedule it
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
日程,定期使用主機任務SC執行應用程序heduling系統。 (例如'cron'或Windows任務計劃程序)睡24小時的線程通常是一個壞主意。 – David
您可以計算下一次需要運行的時間。然後睡一會兒,然後比較當前時間和計算時間。 –
如果它必須是純Java,我會查看Executors.newScheduledThreadPool。創建一個大小爲1的池並給它一個運行readInFile()方法的Runnable。 – jgitter