• 关于java 定时器的使用总结


    直接上代码,代码中有注释(代码中还有一些本人的其他测试,读者可以忽略不计)。读者在代码中发现了bug,欢迎指正。

    package j2se.system.test;

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;

    class TestTask extends TimerTask{
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    int i = 0;
    @Override
    public void run(){
    //假设现在有一个任务,每天要下午15:00执行
    long start = System.nanoTime();
    String time = t.format(new Date());
    System.out.println("time:"+time+"_____ "+(System.nanoTime()-start)+"____i:"+(++i));
    }
    }


    class TestTask2 extends TimerTask{
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    int i = 0;
    @Override
    public void run(){
    System.out.println("come in ");
    //假设现在有一个任务,每月执行一次

    Date d = new Date();//获取服务器的时间。。。
    Calendar c= Calendar.getInstance();
    c.setTime(d);
    int day = c.get(Calendar.DAY_OF_MONTH);
    if(day == 19){
    long start = System.nanoTime();
    String time = t.format(new Date());
    System.out.println("time:"+time+"_____ "+(System.nanoTime()-start)+"____i:"+(++i));
    }

    }
    }

    public class TimeTaskDemo {

    public TimeTaskDemo() {

    }

    //schedule(TimerTask task, Date time) 安排在指定的时间执行指定的任务。如果已过时间,则立即执行
    static void schedule(){
    Date date = null;
    Timer time = new Timer();
    TestTask task = new TestTask();
    String s = "2013-06-19 15:33:00";
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
    date = t.parse(s);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    time.schedule(task, date);
    }

    //schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
    static void schedule02(){
    Date date = null;
    Timer time = new Timer();
    TestTask task = new TestTask();
    String s = "2013-06-19 15:00:00";
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
    date = t.parse(s);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    //如果已过时间点会立刻执行一次
    time.schedule(task, date,10000);
    }

    //void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务。
    static void schedule03(){
    Timer time = new Timer();
    TestTask task = new TestTask();
    time.schedule(task, 10000);
    }

    //schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
    static void schedule04(){
    Date date = null;
    Timer time = new Timer();
    TestTask task = new TestTask();
    String s = "2013-06-19 15:00:00";
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
    date = t.parse(s);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    //如果已过时间点会立刻执行一次
    time.schedule(task, 5000,10000);
    }

    // void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
    // 安排指定的任务在指定的时间开始进行重复的固定速率执行。
    static void scheduleAtFixedRateTest01(){
    Date date = null;
    Timer time = new Timer();
    TestTask task = new TestTask();
    String s = "2013-06-18 15:30:00";
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
    date = t.parse(s);
    } catch (ParseException e) {
    e.printStackTrace();
    }

    //如果过了时间点,会联系执行,比如设置2013-06-19 04:45:00运行,但是在2013-06-19 04:50:00运行,会运行多次,次数= (50-45)*60/10-1
    //?????????????????????????????????????????????
    time.scheduleAtFixedRate(task, date, 10000);
    }

    //scheduleAtFixedRate(TimerTask task, long delay, long period)
    //安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
    static void scheduleAtFixedRateTest02(){
    Timer time = new Timer();
    TestTask task = new TestTask();
    time.scheduleAtFixedRate(task, 5000, 10000);
    }


    //每天17:24执行
    static void scheduleAtFixedRateTest03(){
    Date d = new Date();//获取服务器的时间。。。
    Calendar c= Calendar.getInstance();
    c.setTime(d);
    TestTask task = new TestTask();
    Timer time = new Timer();
    int day = c.get(Calendar.DAY_OF_MONTH);
    int hour = c.get(Calendar.HOUR_OF_DAY) ;
    int minute = c.get(Calendar.MINUTE) ;
    int second = c.get(Calendar.SECOND);
    System.out.println(day);
    System.out.println(hour);
    System.out.println(minute);
    System.out.println(second);
    if(hour >=17 ){
    c.set(Calendar.DAY_OF_MONTH,day+1);
    //如果要求过了时间点执行一次
    task.run();
    }
    c.set(Calendar.HOUR_OF_DAY,17);
    c.set(Calendar.MINUTE,24);
    c.set(Calendar.SECOND,0);
    Date date = c.getTime();
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    System.out.println(t.format(date));
    // time.scheduleAtFixedRate(task, date, 10000);
    time.scheduleAtFixedRate(task, date, 24*60*60*1000);
    }

    //每月19号 17:24执行一次,首先需要在定时器中设定月份,还需要在定时器中的任务执行时,判断当天是不是19号
    //比如在TestTask2 中的run方法中进行判断
    static void scheduleAtFixedRateTest04(){
    int h1 = 17;
    int m1 = 57;
    int s1 = 0 ;

    Date d = new Date();//获取服务器的时间。。。
    Calendar c= Calendar.getInstance();
    c.setTime(d);
    TestTask2 task = new TestTask2();
    Timer time = new Timer();
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);
    int hour = c.get(Calendar.HOUR_OF_DAY) ;
    int minute = c.get(Calendar.MINUTE) ;
    int second = c.get(Calendar.SECOND);
    System.out.println(month);
    System.out.println(day);
    System.out.println(hour);
    System.out.println(minute);
    System.out.println(second);

    if(day > 19){
    c.set(Calendar.MONTH,month+1);
    }else if(day == 19){
    if(hour >=h1){
    c.set(Calendar.MONTH,month+1);
    }
    }else{
    c.set(Calendar.DAY_OF_MONTH,19);
    }
    c.set(Calendar.HOUR_OF_DAY,h1);
    c.set(Calendar.MINUTE,m1);
    c.set(Calendar.SECOND,s1);

    Date date = c.getTime();
    SimpleDateFormat t= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    System.out.println(t.format(date));
    time.scheduleAtFixedRate(task, date, 10000);
    // time.scheduleAtFixedRate(task, date, 24*60*60*1000);
    }



    /**
    * @param args
    */
    public static void main(String[] args) {

    // schedule();

    // schedule02();

    // schedule03();

    // schedule04();

    // scheduleAtFixedRateTest01();

    // scheduleAtFixedRateTest02();

    //每天15:00执行
    // scheduleAtFixedRateTest03();

    //每个月执行一次执行
    scheduleAtFixedRateTest04();



    }

    }

  • 相关阅读:
    【MM系列】SAP 关于物料间的替代问题
    【MM系列】SAP MM模块-配置PO的创建时间
    为什么需要分布式配置中心?
    基于Redis的Spring cache 缓存介绍
    史上最全面的Spring-Boot-Cache使用与整合
    负载均衡
    分布式架构的演进
    9种高性能可用高并发的技术架构
    微服务写的最全的一篇文章
    Java设计模式——合成/聚合复用原则
  • 原文地址:https://www.cnblogs.com/liwei45212/p/3144658.html
Copyright © 2020-2023  润新知