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

作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【javaUp】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。

前言

该类位于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

posted @ 2021-08-28 10:27  前方一片光明  阅读(65)  评论(0编辑  收藏  举报