当前位置: 首页 > news >正文

使用Java实现一个定时器

在实现定时器之前,先了解一下实现过程中需要用到的知识。

java.util.Timer类:

它是一种工具,线程用其安排以后在后台线程中执行的任务,可安排任务执行一次,或者定期重复执行;

其构造方法:

Timer()  创建一个新计时器

Timer(boolean isDaemon)  创建的该计时器可以指定相关的线程作为守护线程运行。

我们需要用到的方法:

void schedule(TimerTask task,Date firstTime,long period)

(看参数大概也可以知道功能)安排指定任务在指定时间开始进行重复执行

//创建一个计时器
Timer timer = new Timer();
//然后调用schedule(TimerTask task,Date firstTime,long period)方法就行了,对里面参数进行导入

聊聊schedule里第一个参数类型TimerTask

TimerTask是一个抽象类,它实现了Runnable接口(所以也可以把它看成一个线程),我们需要对里面的run方法进行实现,也就实现计时器任务执行的操作。

聊聊schedule里第二个参数firstTime

看英文翻译过来的意思我们也可以猜到,它是要我们设置首次运行任务的时间,这个时间类型是Date型的,怎么设置呢?

总不能去计算毫秒然后设置吧。这里需要用到SimpleDateFormat类,设置日期格式创建一个SimpleDateFormat的对象,然后用其调用SimpleDateFormat类中的parse方法,该方法返回一个Date对象。这样就可以按自己的想法去设置firstTime参数了

(第三个参数period就是每次间隔执行任务的时间,long类型,单位是毫秒)

下面是实现代码:

package ly.practice.thread.threadSafety;
import java.util.Timer;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util. *;
/*
 * 使用定时器指定指定任务
 */
public class TimerText {
	public static void main(String[] args) throws ParseException {
		
		//创建定时对象
		Timer timer = new Timer();
		//Timer timer = new Timer(true)//守护线程的方式
		
		
		//指定定时任务
		//timer.schedule(定时任务,第一次执行时间,间隔多久执行一次)
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date firstTime = sdf.parse("2022-10-3 14:52:40");
		//timer.schedule(new LogTimerTask(),fitstTime,1000*60*24*365)一年执行一次
		timer.schedule(new LogTimerTask(), firstTime,1000*10);
	}
}

//编写一个定时任务类
//假设这是一个记录日志的定时任务
class LogTimerTask extends TimerTask{
	public void run() {
		//编写所需要的任务
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String strTime = sdf.format(new Date());
		System.out.println(strTime);
	}
}

首次执行的时间firstTime可以自己设置,编写任务操作也可以按自己的思维去完成.

 

相关文章:

  • 【CSS3】精灵图 背景图 阴影 过渡
  • 微服务笔记:第一章_微服务简介 | Eureka注册中心 | Nacos注册中心 | Nacos配置管理 | Feign
  • 信息检索经典文章-1
  • tensorflow 2.10.0安装所需依赖库版本确定方法
  • Hadoop平台搭建与数据分析实验报告
  • # 透过事物看本质的能力怎么培养?
  • 数据库-存储过程
  • 【0基础学习mysql】之DML-表中数据的操作
  • HybirdCLR 探索—— .NET相关概念(基础)
  • Linux篇【1】:入门与基本指令详解(中)
  • 基于强化学习PPO(Proximal Policy Optimization)算法的无人机姿态控制系统
  • HDFS源码分析——NameNode启动流程
  • 【Day20】LeetCode算法题【1784. 检查二进制字符串字段】【14. 最长公共前缀】
  • 状态反馈镇定之非线性系统反馈线性化
  • 【408计算机组成原理】—加减运算和溢出判断(八)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • leetcode98. Validate Binary Search Tree
  • python大佬养成计划----difflib模块
  • Python进阶细节
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • Xmanager 远程桌面 CentOS 7
  • 记录一下第一次使用npm
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 三分钟教你同步 Visual Studio Code 设置
  • 实现菜单下拉伸展折叠效果demo
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 网页视频流m3u8/ts视频下载
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 温故知新之javascript面向对象
  • Java数据解析之JSON
  • ​ubuntu下安装kvm虚拟机
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 透过事物看本质的能力怎么培养?
  • ###C语言程序设计-----C语言学习(6)#
  • $.ajax,axios,fetch三种ajax请求的区别
  • (07)Hive——窗口函数详解
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (黑马C++)L06 重载与继承
  • (四)linux文件内容查看
  • (四)图像的%2线性拉伸
  • (转)iOS字体
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)winform之ListView
  • (转)大道至简,职场上做人做事做管理
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • @开发者,一文搞懂什么是 C# 计时器!
  • [17]JAVAEE-HTTP协议
  • [ARM]ldr 和 adr 伪指令的区别
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)