33

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

class Test{

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

这如何在java中完成?

4

9 回答 9

56

使用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 );
}
于 2012-07-06T11:31:14.413 回答
17

您可以使用ScheduledExecutorServiceTimer ,这是“ /组合的更通用替代品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);
于 2012-07-06T11:33:35.020 回答
7

这是可能的,我会使用诸如http://quartz-scheduler.org/之类的库

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

于 2012-07-06T11:30:52.730 回答
4

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

于 2012-07-06T11:32:16.107 回答
2

您可以使用Timer类

从文档:

线程调度任务以供将来在后台线程中执行的工具。任务可以安排为一次性执行,或定期重复执行。

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

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

于 2012-07-06T11:31:36.303 回答
2

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

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

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

于 2012-07-06T11:34:44.187 回答
2

有可能的。您可以在某个时间使用Timer和来安排方法TimerTask

例如:

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);

参考这些链接:

于 2012-07-06T11:34:47.220 回答
2

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"));
于 2012-07-06T11:42:32.600 回答
1
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);
于 2018-12-25T16:57:33.477 回答