2011-08-06 78 views
13

我对Java相对比较陌生,并且已经选择了一个可以工作的项目。但是,我遇到了一个块。我需要一种方法在一天中的某个特定时间运行。我已经完成了很多搜索,但是我找不到任何看起来可以实现的技巧。我跑进了Timer类,但它似乎以特定的时间间隔运行。调度程序类似乎具有相同的问题。我也遇到了Quartz,但我认为我需要更轻量级的东西,我只能看到如何间隔地做事情。也许,仅仅因为我是新人,我已经错过了一些能够帮助我在这些课程中的东西,但我很困难并且可以使用一些帮助。每天在特定时间运行Java方法

如果有人可以指示我一个班级在一天中的某个特定时间点上班,每天(可以取消该活动的奖励积分),并告诉我如何正确使用班级,这将是很棒的!

TL; DR:需要一个班级在一天中的某个时间执行某些操作,而不是每隔一段时间执行一次,因为该程序可能会在一天中多次重新启动。

+2

我写了一篇文章重写这一点。这可能可以帮助你:http://harryjoy.wordpress.com/2011/07/09/create-a-scheduler-task-in-java/ –

+0

@ Harry Joy很有帮助。我不知道Quartz –

回答

26

试图获取更多信息的TimerTask类

退房 http://oreilly.com/java/archive/quartz.html

import java.util.Calendar; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class ReportGenerator extends TimerTask { 

    public void run() { 
    System.out.println("Generating report"); 
    //TODO generate report 
    } 

} 

class MainApplication { 

    public static void main(String[] args) { 
    Timer timer = new Timer(); 
    Calendar date = Calendar.getInstance(); 
    date.set(
     Calendar.DAY_OF_WEEK, 
     Calendar.SUNDAY 
    ); 
    date.set(Calendar.HOUR, 0); 
    date.set(Calendar.MINUTE, 0); 
    date.set(Calendar.SECOND, 0); 
    date.set(Calendar.MILLISECOND, 0); 
    // Schedule to run every Sunday in midnight 
    timer.schedule(
     new ReportGenerator(), 
     date.getTime(), 
     1000 * 60 * 60 * 24 * 7 
    ); 
    }//Main method ends 
}//MainApplication ends 
+3

+1:我也喜欢石英。但是使用它与使用cron启动任务相比,它使你的责任是,应用程序永远不会崩溃,如果它仍然崩溃,会自动重新启动等。 – Daniel

+2

请注意,在DST发生更改后,这会被破坏!然后计时器将延迟或快速运行一小时,这里是上午1点或晚上11点(取决于它是在夏天开始并转换到冬天时间,还是相反)。 – Philipp

+0

我添加了date.set(Calendar.AM_PM,Calendar.AM);或PM以使其在我预期的准确时间工作。 –

4

我强烈建议,如果可能的话,最好的方法是使用操作系统的调度程序调用脚本或Java应用程序:例如,* nix中的“cron”或Windows中的“任务调度程序” 。

+0

我会第二个建议。为什么重新实现一切,并担心管理Java应用程序呢? @Eegabooga你真的需要Java吗?如果您需要轻量级解决方案,您可以实施轻量级解决方案,但重复建设的数量可能会很大,并且可能不会那么强大。 –

+0

谢谢大家的回复。但是,我几乎100%肯定这需要在Java中。这不是需要每天在特定时间重新启动的程序,而是程序所执行的操作。即使克朗可以做到这一点,这个程序是不适合我,但其他人。我所做的是一个游戏服务器的插件,并且该插件挂载到这个人的服务器上。如果可能的话,我可以给他发送他需要的cron文件,但是请记住我需要一种在程序中运行的方法,而不是程序本身(对不起,如果语法错误,仍在学习) –

+0

好吧,我现在看到,我可以通过Java和Quartz运行一个cronjob。 –

2

一种可能是使用外部调度程序 - 根据所需要的精度。在UNIX上使用CRON,在Windows上使用Windows计划程序。这很好地隔离了时间与做。

您可以使用计时器并创建一个简单的类,根据所需的粒度检查每分钟或5分钟的时间。这将是非常轻量级的。

相关问题