如何在java中的特定时间调用方法?

时间:2012-07-06 11:28:27

标签: java

是否可以在特定时间调用java中的方法?例如,我有一段这样的代码:

class Test{
 ....
// parameters 
....

public static void main(String args[]) {
   // here i want to call foo at : 2012-07-06 13:05:45 for instance
  foo();
}
}

如何在java中完成此操作?

9 个答案:

答案 0 :(得分:46)

使用java.util.Timer课程,您可以创建一个计时器并安排它在特定时间运行。

以下是示例:

//The task which you want to execute
private static class MyTimeTask extends TimerTask
{

    public void run()
    {
        //write your code here
    }
}

public static void main(String[] args) {

    //the Date and time at which you want to execute
    DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = dateFormatter .parse("2012-07-06 13:05:45");

    //Now create the time and schedule it
    Timer timer = new Timer();

    //Use this if you want to execute it once
    timer.schedule(new MyTimeTask(), date);

    //Use this if you want to execute it repeatedly
    //int period = 10000;//10secs
    //timer.schedule(new MyTimeTask(), date, period );
}

答案 1 :(得分:7)

您可以使用ScheduledExecutorService,这是“Timer / TimerTask组合的更多功能替代品”(根据Timer's javadoc):

long delay = ChronoUnit.MILLIS.between(LocalTime.now(), LocalTime.of(13, 5, 45));
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(task, delay, TimeUnit.MILLISECONDS);

答案 2 :(得分:6)

它是可能的,我会使用像http://quartz-scheduler.org/

这样的库
  

Quartz是一个功能齐全的开源作业调度服务,可以与几乎任何Java EE或Java SE应用程序集成或一起使用 - 从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业;将任务定义为标准Java组件的作业,这些组件可以执行几乎任何可以编程的程序。

答案 3 :(得分:2)

您可以使用课程Timer

来自文档:

  

线程的工具,用于安排将来执行的任务   背景线程。任务可以安排为一次性执行,或   如果定期重复执行。

方法schedule(TimerTask task, Date time)正是您想要的:在指定时间安排指定任务执行。

如果您需要cron格式的时间表,quartz将是一个很好的解决方案。 (quartz cron like schedule

答案 4 :(得分:2)

据我所知,您可以使用Quartz-scheduler。我还没有用过它,但很多人都向我推荐过它。

答案 5 :(得分:2)

如果您正在谈论SE,那么Timer类可能就是您正在寻找的http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html,自Java 5以来可用。

如果您需要在应用程序服务器上下文中计时,我建议您查看自EJB 3.0以来可用的EJB计时器http://www.javabeat.net/2007/03/ejb-3-0-timer-services-an-overview/

或者,根据您真正想要做的事情,您可以详细说明使用cron作业(或任何其他基于操作系统的计时器方法)是否更合适,即您不希望或不能拥有VM一直在跑。

答案 6 :(得分:2)

有可能。您可以使用TimerTimerTask在某个时间安排方法。

例如:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 10);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);

Date alarmTime = calendar.getTime();

Timer _timer = new Timer();
_timer.schedule(foo, alarmTime);

请参阅以下链接:

答案 7 :(得分:1)

java.util.Timer

的简单演示
Timer t=new Timer();
t.schedule(new TimerTask() {
    public void run() {
        foo();
    }
}, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2012-07-06 13:40:20"));

答案 8 :(得分:0)

Timer timer = new Timer();
                    Calendar calendar = Calendar.getInstance(); // gets a calendar using the default time zone and locale.
                    calendar.add(Calendar.SECOND, 5);
                    Date date = calendar.getTime();
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            test();
                        }
                    }, date);