Java定时器的实现需要用到两个类 java.util.Timer及java.util.TimerTask

定时器的应用:

1、晚于当前多少时间后执行;


public static void main(String[] args) throws Exception
{
	new Timer().schedule(new TimerTask()
	{
		@Override
		public void run()
		{
			System.out.println("boom...");
		}
	}, 2000); //晚于当前时间2秒后执行

	//每隔1秒输出当前的秒数 用于观察定时器是否按照设置的时间运行
	while(true)
	{
		System.out.println(new Date().getSeconds());
		Thread.sleep(1000);
	}
}


2、每隔一定的时间执行一次;

public static void main(String[] args) throws Exception
{
	new Timer().schedule(new TimerTask()
	{
		@Override
		public void run()
		{
			// TODO Auto-generated method stub
			System.out.println("boom2...");
		}
	}, 2000, 1000);//2秒后第一次执行,之后没1秒执行一次
	
	//每隔1秒输出当前的秒数 用于观察定时器是否按照设置的时间运行
	while(true)
	{
		System.out.println(new Date().getSeconds());
		Thread.sleep(1000);
	}
}




3、交错执行 如2秒后执行一次,间隔4秒后执行一次,再间隔2秒后执行一次,如此循环;

a、第一种实现方式

创建一个类(MyTimerTask),并创建一个静态变量用于记录对象被创建的次数;

class MyTimerTask extends TimerTask
{
    //用于记录对象被创建的次数
    private static int count = 0;
    @Override
    public void run()
    {
        count = (++count % 2);
        System.out.println("boom3...");
        new Timer().schedule(new MyTimerTask(), 2000 + (2000 * count));
    }
    
}


main方法调用定时器

public static void main(String[] args) throws Exception
{
	
	new Timer().schedule(new MyTimerTask(), 2000);

	//每隔1秒输出当前的秒数 用于观察定时器是否按照设置的时间运行
	while(true)
	{
		System.out.println(new Date().getSeconds());
		Thread.sleep(1000);
	}
}



总结:通过count变量计算出调用的奇偶次数,达到交错执行的目的


b、第二种实现方式

创建两个类(MyTimerTask1和MyTimerTask1),在对象中相互调用;

class MyTimerTask1 extends TimerTask
{

    @Override
    public void run()
    {
        System.out.println("boom4-1");
        //4秒后调用MyTimerTask2
        new Timer().schedule(new MyTimerTask2(), 4000);
        
    }
    
}

class MyTimerTask2 extends TimerTask
{

    @Override
    public void run()
    {
        System.out.println("boom4-2");
      //2秒后调用MyTimerTask1
        new Timer().schedule(new MyTimerTask1(), 2000);
    }
    
}



main方法中调用定时器

public static void main(String[] args) throws Exception
{
	
	//调用MyTimerTask1
	new Timer().schedule(new MyTimerTask1(), 2000);

	//每隔1秒输出当前的秒数 用于观察定时器是否按照设置的时间运行
	while(true)
	{
		System.out.println(new Date().getSeconds());
		Thread.sleep(1000);
	}
}



总结:在两个对象中互相调用达到交错执行的目的。


4、指定某一时刻执行

public static void main(String[] args) throws Exception
{
	//将字符串转换成Date
	Date date = stringToDate("yyyy-MM-dd HH:mm:ss",
			"2014-04-26 22:08:00");
			
	new Timer().schedule(new TimerTask()
	{
		
		@Override
		public void run()
		{
			// TODO Auto-generated method stub
			System.out.println("Boom...");
		}
	}, date);
	
	//每个1秒输出当前的秒数 用于观察定时器是否按照设置的时间运行
	while(true)
	{
		System.out.println(new Date().getSeconds());
		Thread.sleep(1000);
	}
}



指定格式字符串转Date

private static Date stringToDate(String fmt, String srcDate)
		throws Exception
{
	SimpleDateFormat sdf = new SimpleDateFormat(fmt);
	Date date = sdf.parse(srcDate);
	return date;
}



5、每天的固定时间执行(如每天凌晨1点);

public static void main(String[] args) throws Exception
{
	
	Date date = stringToDate("yyyy-MM-dd HH:mm:ss",
			"2014-06-06 01:00:00");
	new Timer().schedule(new TimerTask()
	{
		@Override
		public void run()
		{
			// TODO Auto-generated method stub
			System.out.println("Boom...");
		}
	}, date, 86400000); 
	//1000 * 60 * 60 * 24 将24小时转换成毫秒 间隔24小时 则从6月6号开始每天凌晨1点执行一次
}





如果还需要如每周一至周五某个时间点执行等更多功能的调度器,开源的quartz 应该会满足你