java中定时器Timer/TimerTask的使用方法

第一种方法:schedule(TimerTask task, long delay) 设定指定任务task在指定延迟delay后执行

第二种方法:schedule(TimerTask task, long delay, long period) 设定指定任务task在指定延迟delay后进行固定频率peroid的执行  

第三种方法:schedule(TimerTask task,Date time) 设定指定任务task在指定时间time执行

第四种方法:schedule(TimerTask task,Date firstTime,long period) 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行

第五种方法:scheduleAtFixedRate(TimerTask task, long delay, long period) 设定指定任务task在指定延迟delay后进行固定频率peroid的执行 

第六种方法:scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行

package test;

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

/**
 * @author Solin
 *
 */
public class TimeTest {
	public static void main(String[] args) {
		timer1();
	}
	
	/**
	 * 第一种方法:设定指定任务task在指定延迟delay后执行
	 * schedule(TimerTask task, long delay)
	 */
	public static void timer1(){
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("设定指定任务task在指定延迟delay后执行");
			}
		}, 2000);
	}
	
	/**
	 * 第二种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行  
	 * schedule(TimerTask task, long delay, long period)
	 */
	public static void timer2(){
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println(new Date()+"  设定指定任务task在指定延迟delay后进行固定频率peroid的执行");
			}
		}, 1000, 2000);
	}
	
	
	/**
	 * 第三种方法:设定指定任务task在指定时间time执行 
	 * schedule(TimerTask task,Date time)
	 */
	public static void timer3(){
		Calendar calendar = Calendar.getInstance();    
		calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时    
		calendar.set(Calendar.MINUTE, 42);    // 控制分    
		calendar.set(Calendar.SECOND,55);    // 控制秒     
		Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的12:00:00     
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("设定指定任务task在指定时间time执行");
			}
		}, time);
	}
	
	/**
	 * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行
	 * schedule(TimerTask task,Date firstTime,long period)
	 */
	public static void timer4(){
		Calendar calendar = Calendar.getInstance();    
		calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时    
		calendar.set(Calendar.MINUTE, 42);    // 控制分    
		calendar.set(Calendar.SECOND,55);    // 控制秒     
		Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的12:00:00     
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println(new Date()+"  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");
			}
		}, time,2000);
	}
	
	/**
	 * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行  
	 * scheduleAtFixedRate(TimerTask task, long delay, long period)
	 */
	public static void timer5(){
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				System.out.println(new Date()+"  设定指定任务task在指定延迟delay后进行固定频率peroid的执行");
			}
		}, 1000, 2000);
	}
	
	/**
	 * 第六种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行
	 * scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
	 */
	public static void timer6(){
		Calendar calendar = Calendar.getInstance();    
		calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时    
		calendar.set(Calendar.MINUTE, 42);    // 控制分    
		calendar.set(Calendar.SECOND,55);    // 控制秒     
		Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的12:00:00     
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				System.out.println(new Date()+"  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");
			}
		}, time,2000);
	}
}
schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。
比如:

public static void timer6(){
		Calendar calendar = Calendar.getInstance();    
		calendar.set(Calendar.HOUR_OF_DAY, 11); // 控制时    
		calendar.set(Calendar.MINUTE, 20);    // 控制分    
		calendar.set(Calendar.SECOND,00);    // 控制秒     
		Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的11:20:00     
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				System.out.println(new Date()+"  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");
			}
		}, time,60*1000);
	}

间隔时间是1分钟,指定开始时间是今天的 11:20:00,如果我在11:24:30执行这个程序,那么会立刻打印5次

Wed Nov 02 11:24:30 CST 2016  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:20:00
Wed Nov 02 11:24:30 CST 2016  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:21:00
Wed Nov 02 11:24:30 CST 2016  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:22:00
Wed Nov 02 11:24:30 CST 2016  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:23:00
Wed Nov 02 11:24:30 CST 2016  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:24:00

并且注意,下一次执行是在11:25:00 而不是 11:25:30。就是说是从指定的开始时间开始计时,而不是从执行时间开始计时。

但是上面如果用schedule方法,间隔时间是1分钟,指定开始时间今天11:20:00,那么在11:24:30执行这个程序,则立即执行程序一次。并且下一次的执行时间是11:25:30,而不是从11:20:00开始算的周期(11:25:00)。


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值