Java TimerTask具有时间,延迟和周期

时间:2015-03-23 04:44:51

标签: java timer timertask

我想安排我的程序在上午9:00到上午10:00之间运行,它应该在指定的时间间隔内每10秒运行一次。我正在使用方法scheduleAtFixedRate()。该方法允许延迟,周期或第一时间。但我需要第一次,延迟,期间。

这是我的代码。

import java.util.*;

public class TimerDemo extends TimerTask
{
public TimerDemo()
{
    Timer timer = new Timer();
    Calendar date = Calendar.getInstance();
    date.set(Calendar.HOUR, 9);
    date.set(Calendar.MINUTE, 0);
    timer.scheduleAtFixedRate(this, new Date(), 2000);
}
public void run()
{
    System.out.println("This is the new Task");
}
public static void main (String args[])
 {
    new TimerDemo();
 }
}

有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

你可以将它们堆叠在一起,即首先使用

启动一些虚拟任务
void java.util.Timer.schedule(TimerTask task, Date time)

然后,您可以使用

从此虚拟任务调用主任务
public void scheduleAtFixedRate(TimerTask task,
                                long delay,
                                long period)

这样做应该允许您使用主任务控制第一次(通过虚拟任务)和延迟和周期。这可能看起来像这样......

    package sorting;

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

public class TimerDemo 
{

    static class StarterTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("Dummy task invoked");
            Timer timer = new Timer();
            timer.schedule(new MainTask(), 10*1000, 60*60*1000);
        }

    }

    static class MainTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("Main task invoked");
        }

    }

    public TimerDemo()
    {
        Timer timer = new Timer();
        Calendar date = Calendar.getInstance();
        date.set(Calendar.HOUR, 9);
        date.set(Calendar.MINUTE, 0);
        timer.schedule(new StarterTask(), date.getTime()); 
    }

    public static void main (String args[])
    {
        new TimerDemo();
    }
}

请注意,当您将其与

组合使用时,您当然可以使用其他“堆叠”方法
cancel()

功能

答案 1 :(得分:0)

我已针对此问题提供了精简版解决方案。这将根据输入开始时间和结束时间运行您的任务。我用了joda时间。你可以24小时格式使用时间。

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import org.joda.time.DateTime;
public class NewTimerDemo extends TimerTask
{ 
  static Timer timer  = new Timer();
  static String startTime = "12:28";
  static String endTime = "12:30";

@Override
public void run()
{
    System.out.println("Running your Task");

    DateTime dt = new DateTime().withTime(
            Integer.parseInt(endTime.split(":")[0]), 
            Integer.parseInt(endTime.split(":")[1]), 0, 0);
    if(!dt.isAfterNow())
    {
        System.out.println("Here to cancel");
        timer.cancel();
    }
}
 public static void main(String args[])
 {
    DateTime dt = new DateTime().withTime(
            Integer.parseInt(startTime.split(":")[0]), 
            Integer.parseInt(startTime.split(":")[1]), 0, 0);
    System.out.println(dt);
    Date date = dt.toDate();
    timer.schedule(new NewTimerDemo(), date, 5*1000);
 }
}