【Java多线程编程核心技术】5.定时器Timer-笔记总结

相关链接:
【Java多线程编程核心技术】1.Java多线程技能-笔记总结
【Java多线程编程核心技术】2.对象及变量的并发访问(上)-笔记总结
【Java多线程编程核心技术】2.对象及变量的并发访问(下)-笔记总结
【Java多线程编程核心技术】3.线程间通信 -笔记总结
【Java多线程编程核心技术】4.Lock的使用-笔记总结
【Java多线程编程核心技术】5.定时器Timer-笔记总结
【Java多线程编程核心技术】6.单例模式与多线程-笔记总结
【Java多线程编程核心技术】7.拾遗增补-笔记总结

定时器Timer的使用

Time类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类(抽象类)

方法schedule(TimerTask task,Date time)

作用:在指定的日期执行一次某任务;

package test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run1 {
    private static Timer timer = new Timer();
//    private static Timer timer = new Timer(true);
    static public class MyTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("运行了!时间为:" + new Date());
        }
    }
    public static void main(String[] args) {
        try {
            MyTask task = new MyTask();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = "2017-11-22 19:43:10";
            Date dateRef = sdf.parse(dateString);
            System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:"
                    + new Date().toLocaleString());
            timer.schedule(task, dateRef);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
输出结果:
字符串时间:2017-11-22 19:43:10 当前时间:2017-11-22 19:43:05
运行了!时间为:Wed Nov 22 19:43:10 CST 2017

private static Timer timer = new Timer(true); 表示将新建的Timer()改成守护线程Daemon

如何执行任务的时间早于当前时间,则立即执行 task任务

Timer中运行有多个TimerTask任务

timer.schedule(task1,dateRef1);
timer.schedule(task2,dateRef1);

TimerTask是以队列的方式一个一个被顺序执行的,如果前面的任务消耗时间较长,则后面的任务运行的时间也会被延迟

方法schedule(TimerTask task,Date firstTime,long period)

作用:在指定的日期之后,按指定的间隔周期性地无限循环地执行某一个任务。

package test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run {
    static public class MyTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("运行了!时间为:" + new Date());
        }
    }
    public static void main(String[] args) {
        try {
            MyTask task = new MyTask();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateString = "2014-10-12 09:12:00";
            Timer timer = new Timer();
            Date dateRef = sdf.parse(dateString);
            System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:"
                    + new Date().toLocaleString());
            timer.schedule(task, dateRef, 4000);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
输出结果:
字符串时间:2017-11-22 19:51:30 当前时间:2017-11-22 19:51:18
运行了!时间为:Wed Nov 22 19:51:30 CST 2017
运行了!时间为:Wed Nov 22 19:51:34 CST 2017
运行了!时间为:Wed Nov 22 19:51:38 CST 2017
......

执行时间早于当前时间时,则立即执行。

任务执行时间被延时
例如在run(){… sleep(5000) …} 而timer.schedule(taskA,dateRef,4000);
一个一个顺序运行,但间隔为5000毫秒

TimerTask类的cancel()方法
作用:将自身从任务队列中清除,其他任务不收影响

Timer类的cancel()方法
作用:将任务队列中的全部任务清空

方法schedule(TimerTask task,long delay)

作用:以当前时间为参考时间,在此基础上延迟指定毫秒数后执行一次TimerTask任务。

方法schedule(TimerTask task,long delay,long period)

作用:以当前时间为参考时间,在此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一个任务。

方法scheduleAtFixedRate(TimerTask task,Date firstTime,long period)

在不延时的情况下
schedule方法:下一次任务的执行时间参考上一次任务的“开始”时间,不具有追赶执行性
scheduleAtFixedRate方法:参考上一次任务的结束时间,具有追赶执行性。(如下图:)

package test.run;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Run6 {
     private static Timer timer = new Timer();
     static public class MyTask1 extends TimerTask {
          @Override
          public void run() {
                   System.out.println("1 begin 运行了!时间为:" + new Date());
                   System.out.println("1   end 运行了!时间为:" + new Date());
          }
     }
     public static void main(String[] args) {
          try {
              MyTask1 task1 = new MyTask1();
              SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              String dateString1 = "2017-11-22 20:08:30";
              Date dateRef1 = sdf1.parse(dateString1);
              System.out.println("字符串1时间:" + dateRef1.toLocaleString() + " 当前时间:"
                        + new Date().toLocaleString());
              timer.scheduleAtFixedRate(task1, dateRef1, 5000);
          } catch (ParseException e) {
              e.printStackTrace();
          }
     }
}
输出结果:
字符串1时间:2017-11-22 20:08:30 当前时间:2017-11-22 20:08:46
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:50 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:50 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:08:55 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:08:55 CST 2017
1 begin 运行了!时间为:Wed Nov 22 20:09:00 CST 2017
1   end 运行了!时间为:Wed Nov 22 20:09:00 CST 2017
........

在计划时间早于当前时间时,立即执行!而且两个时间段内所对应的Task任务被“补充性”执行了,也就是Task任务追赶执行的特性

你可能感兴趣的:(Java多线程,Java多线程编程核心技术)