2015-10-13 63 views
4

我試圖讓函數每天都被調用。現在我的代碼如下:試圖每24小時調用一次函數

do { 
    Thread.sleep(1000*60*60*24); 
    readInFile(); 
} while (true); 

的問題是,它被稱爲每天再加上它需要執行功能readInFile的時間。有沒有辦法做回調或每24小時都會關閉的東西?

+16

日程,定期使用主機任務SC執行應用程序heduling系統。 (例如'cron'或Windows任務計劃程序)睡24小時的線程通常是一個壞主意。 – David

+1

您可以計算下一次需要運行的時間。然後睡一會兒,然後比較當前時間和計算時間。 –

+0

如果它必須是純Java,我會查看Executors.newScheduledThreadPool。創建一個大小爲1的池並給它一個運行readInFile()方法的Runnable。 – jgitter

回答

3

你可以試試這個:

Timer timer = new Timer(); 
TimerTask t = new TimerTask() { 
    @Override 
    public void run() { 
     // some code 
    } 
}; 

timer.schedule (t, 0l, 1000*60*60*24); 

否則你可以使用ScheduledExecutorService

一個ExecutorService,可安排的命令給定的 延遲後運行或定期地執行。

+0

這不會比睡眠呼叫更好。 –

+0

's/schedule/scheduleAtFixedRate /' – zapl

+0

@MartinJames: - Hmm..ScheduledExecutorService會做的。 Tunaki已經擊中了它。 –

6

您可以使用ScheduledExecutorService.scheduleAtFixedRate方法以固定速率調用Runnable

示例代碼來調用每一天(無初始延遲)可運行:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.scheduleAtFixedRate(myRunnable, 0, 1, TimeUnit.DAYS); 
0

在過去,我已經做這種類型的事情與Windows任務調度和Unix cron作業。

1

您可以使用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);