【问题标题】:Schedule Task in java using Timer使用定时器在java中安排任务
【发布时间】:2014-11-10 06:38:02
【问题描述】:

我已经使用 java 创建了时区特定的计划任务事件。我的代码如下。

Timer timer = new Timer();
Calendar date = Calendar.getInstance(TimeZone.getTimeZone("Asia/Colombo"));
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
timer.schedule(new TimerTask() {
    public void run() {
        System.out.println("Runs everday morning 12.00 AM");
    }
 }, date.getTime(), 1000 * 60 * 60 * 24);

但问题是当调用这个方法时它很快就会运行这个任务。我需要每天在亚洲/科伦坡时区 12.00 运行这项工作。该怎么做?

【问题讨论】:

  • 服务器上设置了什么时区,运行时间是什么?
  • 我现在在本地运行。所以现在亚洲/科伦坡。有什么帮助吗??
  • 实际运行时间是什么时候?
  • 我将它定义为在使用 web.xml 部署 Web 应用程序时运行现在我需要使该代码在特定时区的凌晨 12 点时第一次执行任务。我认为 date.getTime() 在那个时间运行。有什么问题?
  • 顺便说一下,您不应该在 Web 应用程序(Servlet 或 Java EE 环境)中使用 Timer。请查看 [ScheduledExecutorService](docs.oracle.com/javase/7/docs/api/java/util/concurrent/…)。并将 ServletContextListener 视为设置和安排任务的地方。

标签: java timer timezone scheduled-tasks


【解决方案1】:

您在过去(当天午夜)安排您的第一次执行,因此您的任务将立即执行。

根据javadoc

[...] 如果计划的第一次是过去,则计划立即执行。

解决此问题的最简单方法是在计划的首次执行时间上增加 1 天:

date.add(Calendar.DATE, 1);

此外,您可能希望将此任务的执行安排为固定速率,而不是固定延迟。如果您不这样做,您的任务将每天稍晚执行,具体取决于完成任务所需的实际时间。再次,请参阅javadoc 了解详细信息。

【讨论】:

  • 那么如何设置到第二天那个时间执行呢?
猜你喜欢
  • 2011-07-21
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2017-02-17
  • 2010-10-22
相关资源
最近更新 更多