架构系列——定时任务中的Timer类使用简析

作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【程序员高手之路】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。技术交流、项目合作可私聊:shuhao-99999。

前言

该类位于java.util包下

最近项目用到了Timer类(用于定时任务),记录一下要点与心得,方便以后查看

一、源码中的几个方法

1.经过delay(ms)后开始进行调度一次

2.在指定的时间点time上调度一次

 

3.在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调(算是周期性调度任务)

4.跟第3个一样,也是周期性调度任务,只是第二个参数为第一次调度的时间

二、案例

package 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中守护线程的总结

OK,GAME OVER

原文地址:https://www.cnblogs.com/shuhao66666/p/12925387.html