Java Timer定时器的四种方法

Timer定时任务代码简洁,用的较为广泛,但除了传递TimerTask外,还有后面的一些参数在使用时,容易搞混淆,所以我特意从源码中找出来,整理一下。

    1.当传递的参数只有一个long类型的delay时,就是延迟delay毫秒执行一次,但线程不会被销毁

public void schedule(TimerTask task, long delay) {
	if (delay < 0)
		throw new IllegalArgumentException("Negative delay.");
	sched(task, System.currentTimeMillis()+delay, 0);
}

例如:

    public static void main(String[] args) throws ParseException {
        long delay = 1000;//1毫秒
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,delay);
    }

会在延迟1000毫秒后输出当前时间戳一次,但程序不会结束运行 。

 

  2.当传递的参数只有一个Date类型的time时,就是任务在time时刻开始执行一次

public void schedule(TimerTask task, Date time) {
	sched(task, time.getTime(), 0);
}

 例如:

    public static void main(String[] args) throws ParseException {
        Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-09-09 11:40:00");
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,time);
    }

会在2020-09-09 11:40:00时刻输出当前时间戳一次,但程序不会结束运行 。

 

    3.当传递的参数有一个long类型的delay和一个long类型的period时,就是延迟delay毫秒后, 每隔period毫秒执行一次

public void schedule(TimerTask task, long delay, long period) {
	if (delay < 0)
		throw new IllegalArgumentException("Negative delay.");
	if (period <= 0)
		throw new IllegalArgumentException("Non-positive period.");
	sched(task, System.currentTimeMillis()+delay, -period);
}

例如: 

   public static void main(String[] args) throws ParseException {
        long delay = 1000;//1毫秒
        long period = 1000;//1毫秒
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,delay,period);
    }

 会在延迟1000毫秒后执行一次输出当前时间戳,然后每隔一秒执行一次输出当前时间戳。

 

    4.当传递的参数有一个Date类型的firstTime和一个long类型的period时,就是在firstTime开始执行第一次,然后每隔 period毫秒执行一次

public void schedule(TimerTask task, Date firstTime, long period) {
	if (period <= 0)
		throw new IllegalArgumentException("Non-positive period.");
	sched(task, firstTime.getTime(), -period);
}

例如:

  public static void main(String[] args) throws ParseException {
        Date time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-09-09 11:40:00");
        System.out.println(time);
        long period = 5000;//5毫秒
        TimerTask tt = new TimerTask() {
            @Override
            public void run() {
                System.out.println("当前时间戳:"+System.currentTimeMillis());
            }
        };
        Timer t = new Timer();
        t.schedule(tt,time,period);
    }

会在2020-09-09 11:40:00时刻执行一次输出当前时间戳,然后每隔5秒执行一次

 

我整理一个表格方便记忆查询

四种参数任务执行方式任务执行次数
schedule(TimerTask task, long delay)延迟delay毫秒执行执行一次
schedule(TimerTask task, Date time)在time时刻开始执行执行一次
schedule(TimerTask task, long delay, long period)延迟delay毫秒后执行一次,然后每隔period毫秒执行一次无限执行
schedule(TimerTask task, Date firstTime, long period)在firstTime时刻开始执行一次,然后每隔 period毫秒执行一次无限执行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值