前言
该类位于java.util包下
最近项目用到了Timer类(用于定时任务),记录一下要点与心得,方便以后查看
一、源码中的几个方法
1.经过delay(ms)后开始进行调度一次
2.在指定的时间点time上调度一次
3.在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调(算是周期性调度任务)
4.跟第3个一样,也是周期性调度任务,只是第二个参数为第一次调度的时间
二、案例
ppackage com.test.client; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * @ClassName: Test * @Description: * @author: hanshuhao * @date: 2019年10月29日 */ public class TestTimer { public static void main(String[] args) throws InterruptedException{ Timer timer = new Timer(); Calendar calendar = Calendar.getInstance(); //开始时间为当前时间+3秒 calendar.add(Calendar.SECOND, 3); Date startDate = calendar.getTime(); System.out.println(startDate); TimerTask task = new Mytask("my_task1"); TimerTask task2 = new Mytask("my_task2"); //timer每隔5秒调用一次task timer.schedule(task, startDate, 5000); timer.schedule(task2, startDate, 5000); //测试守护线程 // while(true) { // System.out.println("running..."); // Thread.sleep(10000); // break; // } } } class Mytask extends TimerTask{ String taskName = ""; public Mytask(String name) { this.taskName = name; } @Override public void run() { // TODO Auto-generated method stub Thread thread = new Thread(() -> { try { System.out.println("the task " + this.taskName + " begin at " + System.currentTimeMillis()); Thread.sleep(3000); System.out.println("the task " + this.taskName + " done at " + System.currentTimeMillis()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }); thread.start(); } }
三、扩展
Timer类有个带boolean参数的构造方法,里面可以填写是否为守护线程。顺便把守护线程也了解了一下,简单来说,只要有用户线程在运行,守护线程就不会停掉。(参考: Java中守护线程的总结)