2011-06-01 215 views
0

我需要幫助來在特定時間(例如下午2點)在服務器上運行我的Java程序(以索引新文件)。在特定時間運行Java程序

有人告訴我,Java有一些東西叫做工作,但我不知道如何使用它。我試過這個:

boolean cond=true; 
while(cond){ 
    @SuppressWarnings("deprecation") 
    int heur = new Date().getHours(); 
    @SuppressWarnings("deprecation") 
    int minute= new Date().getMinutes(); 
    if(heur==16 && minute==02){ 
     indexer.close(); 
     end = new Date().getTime(); 
     File f; 
     cond=false; 
    } 

但是,這個程序仍在運行。

如何在特定時間運行我的程序?

+0

PLZ格式的代碼正確 – Bohemian 2011-06-01 12:36:29

回答

3

這是一個名爲Quartz的API,它是您的程序可以安排「作業」的地方,它將在那個時間運行它。

直到我可以舉一個例子,試試this link

編輯: 首先,您必須創建一個實現org.quartz.Job的類。當你實現它時,你將不得不實現方法execute(JobExecutionContext jobExecution),這是觸發「觸發器」時將運行的方法。

要設置時間表:

SchedulerFactory schedulerFactory = new StdSchedulerFactory(); 
// Retrieve a scheduler from schedule factory 
Scheduler scheduler = null; 
try { 
    scheduler = schedulerFactory.getScheduler(); 
} 
catch (SchedulerException e) { 
    e.printStackTrace(); 
} 

//Set up detail about the job 
JobDetail jobDetail = new JobDetail("jobDetail", "jobDetailGroup", ImplementedJob.class); 
SimpleTrigger simpleTrigger = new SimpleTrigger("Trigger Name","defaultGroup", DATE); 

// schedule a job with JobDetail and Trigger 
scheduler.scheduleJob(jobDetail, simpleTrigger); 
// start the scheduler 
scheduler.start(); 
+0

你能不能給個例如何使用!我下載了它,但是我應該把代碼放在start()和shutdown()調用之間。我怎麼能給它時間 – Dilllllo 2011-06-01 16:54:31

+0

爲什麼使用石英時,標準庫有你所需要的? – Bohemian 2011-06-01 21:55:28

2

有一個在循環中沒有Thread.sleep()調用,所以它會「旋轉」以100%的CPU(不好),但它是一個糟糕的設計呢。一個很大的改進就是簡單地計算「現在」和你希望它運行的毫秒數,然後調用Thread.sleep(n)。

但是,更好的解決方案是使用JDK已經提供的內容。

看看這個代碼,它使用來自JDK 併發庫的類。 這是一個非常簡單的例子,將工作:

import java.util.concurrent.*; 

public static void main(String[] args) 
{ 
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
    Runnable runnable = new Runnable() { 
     public void run() 
     { 
      // do something; 
     } 
    }; 

    // Run it in 8 hours - you would have to calculate how long to wait from "now" 
    service.schedule(runnable, 8, TimeUnit.HOURS); // You can 
}