继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

java之定时器任务Timer用法

胡说叔叔
关注TA
已关注
手记 472
粉丝 130
获赞 581

在项目开发中,经常会遇到需要实现一些定时操作的任务,写过很多遍了,然而每次写的时候,总是会对一些细节有所遗忘,后来想想可能是没有总结的缘故,所以今天小编就打算总结一下可能会被遗忘的小点:

 1. public void schedule(TimerTask task,Date time) 这个方法中如启动时,已经过了time的时间,则系统会在启动后直接执行一次,
    话不多少直接上代码

复制代码

package com.test.timer.task;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.Timer;import java.util.TimerTask;import org.junit.Test;/**
 * 
 * java实现定时器的若干方法
 * 
 * @author jimi
 * */public class TestTask {    
    private static Timer timer = new Timer();    
    private static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");    
    public static void main(String[] args){
        Calendar calendar = Calendar.getInstance();        int year = calendar.get(Calendar.YEAR);       
        int month = calendar.get(Calendar.MONTH);        int day = calendar.get(Calendar.DAY_OF_MONTH);
        calendar.set(year,month,day,20,35,00);        
        //如果这个时间已经过了,则会启动会立即执行一次
        timer.schedule(new TimerTask() {
            @Override            public void run() {
                System.out.println("固定执行任务的时间:" + dateFormat.format(new Date()));
            }
        }, calendar.getTime());
    }
    
}

复制代码

代码中我指定在当天的20时35分执行,启动程序后的结果如下:

[object Object]
可以看到我程序是在20:40:47执行的,已经超过我设置的20时35分00秒,所以启动后直接执行一次。

2.

复制代码

package com.test.timer.task;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;/**
 * 
 * java实现定时器的若干方法
 * 
 * @author jimi
 * */public class TestTask {    
    private static Timer timer = new Timer();    
    private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
    private static int index = 0;    
    public static void main(String[] args) throws ParseException{        
        //固定速率
        timer.scheduleAtFixedRate(new TimerTask() {
                    @Override                    public void run() {
                        index++;                        if (index % 5 == 0){                            try {
                                Thread.sleep(5000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("每隔4秒执行一次:" + dateFormat.format(new Date()));
                    }
                }, 0, 4000);
        
    }
    
}

复制代码


从代码可以看出,在index为5的倍数时,程序会休眠5秒,我们了来看看执行的结果

复制代码

每隔4秒执行一次:2018-08-10 19:12:09
每隔4秒执行一次:2018-08-10 19:12:13
每隔4秒执行一次:2018-08-10 19:12:17
每隔4秒执行一次:2018-08-10 19:12:21
每隔4秒执行一次:2018-08-10 19:12:30
每隔4秒执行一次:2018-08-10 19:12:30
每隔4秒执行一次:2018-08-10 19:12:33
每隔4秒执行一次:2018-08-10 19:12:37
每隔4秒执行一次:2018-08-10 19:12:41
每隔4秒执行一次:2018-08-10 19:12:50
每隔4秒执行一次:2018-08-10 19:12:50
每隔4秒执行一次:2018-08-10 19:12:53
每隔4秒执行一次:2018-08-10 19:12:57
每隔4秒执行一次:2018-08-10 19:13:01
每隔4秒执行一次:2018-08-10 19:13:10
每隔4秒执行一次:2018-08-10 19:13:10

复制代码

我们可以看出在第五次和第六次同时运行,且第七次的时间并未是在19:12:30的基础加4秒,而是在程序启动后预先计算好的时间也就是19:12:33秒,所可以看scheduleAtFixedRate的执行时间是按照预先的固定速率来执行,不会因为某一次的延迟而影响后面的计划时间。

我们再来看看schedule的代码和执行情况

复制代码

package com.test.timer.task;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;/**
 * 
 * java实现定时器的若干方法
 * 
 * @author jimi
 * */public class TestTask {    
    private static Timer timer = new Timer();    
    private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
    private static int index = 0;    
    public static void main(String[] args) throws ParseException{        
        //非固定速率
        timer.schedule(new TimerTask() {
            
            @Override            public void run() {
                index++;                if (index % 5 == 0){                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("每隔4秒执行一次:" + dateFormat.format(new Date()));
            }
        }, 0, 4000);
    }
    
}

复制代码

执行情况如下

复制代码

每隔4秒执行一次:2018-08-10 19:17:12每隔4秒执行一次:2018-08-10 19:17:16每隔4秒执行一次:2018-08-10 19:17:20每隔4秒执行一次:2018-08-10 19:17:24每隔4秒执行一次:2018-08-10 19:17:33每隔4秒执行一次:2018-08-10 19:17:33每隔4秒执行一次:2018-08-10 19:17:37每隔4秒执行一次:2018-08-10 19:17:41每隔4秒执行一次:2018-08-10 19:17:45每隔4秒执行一次:2018-08-10 19:17:54每隔4秒执行一次:2018-08-10 19:17:54每隔4秒执行一次:2018-08-10 19:17:58

复制代码

可以看出schedule在执行完第5、6次任务后,第7次的时间则是按照定时计划4秒后执行的,可见schedule在任务执行过程中,如果某一次任务延时,则后续任务会跟着延时后的时间重新计算定时执行时间。

 

 

好了,小编今天就先码到这里,后面可能还会再介绍spring的定时任务,以及spring+quartz实现的定时任务。

原文出处:https://www.cnblogs.com/ljy-20180122/p/9404426.html

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP