2011-06-01 192 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 
}