让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器

简介: 定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。

一.⭐⭐⭐定时器概述🌙🌙🌙

  1. 何为定时器?
    ①就像可以设置闹钟的时钟一样。当我们往时钟里添加一个闹钟时,可以设置闹钟的首次执行时间、执行间隔时间、备注、是否启动等属性。
    ②一个时钟可以设置多个不同的闹钟,每个闹钟可以有各自的首次执行时间、执行间隔时间、备注、是否启动等属性。
    ③当闹钟响起后,如果我们不手动关闭该闹钟,那么它将会按照设定的执行间隔时间,一直持续执行下去,除非时钟电量耗尽。
    就如同一个可以设置闹钟的时钟一样,定时器有如下特性:
    ①往定时器添加一个任务(就如同时钟上的闹钟)时,可以设置任务的首次执行时间、执行间隔时间、备注、是否启动等属性。
    ②可以添加多个不同的任务,每个任务都有各自的首次执行时间、执行间隔时间、备注、是否启动等属性.
    ③当任务启动后,除非调用任务取消的方法或者定时器取消方法,否则任务将按照设定的执行间隔时间,一直持续执行下去。
  2. 如何自定义实现一个定时器?
    当理解了定时器是啥后,我们就可以很容易利用面向对象编程的思想,去构造一个满足定时器特性的自定义的定时器了。

二.⭐⭐⭐自定义定时器🌙🌙🌙

1.自定义定时任务接口(用于实现特性②,通过实现接口可以生成多个不同的任务实现)

public interface ITimerTask{
   public void doTimerTask ();}

2.实现自定义的定时任务接口(具体的任务实现)

pulic class TimerTaskImp implements ITimerTask{
   
@Override
public void doTimerTask(){
   开始执行具体业务处理逻辑};
}

3.定义定时任务处理线程(拥有任务属性类,方便在添加任务时对不同任务设置各自的属性)

class TimetTaskItem{
   //单个Timer的相关参数
 public ITimerTask timerTask = null; //执行定时任务的实现类
 public long iPeriodTime = 0; //定时的周期时间(毫秒)
 public long iNextTriggerTime = 0; //下次触发时间
 public boolean bIsRun = true;
 public void cancel(){
   //取消任务执行的方法
  this.bIsRun = false;
 }
}
public class TimerTaskThread extends Thread{
   //定时器(通过线程的方式实现,Java原生定时器也是通过线程管理任务的定时执行的)
  private ArrayList<TimerTaskItem> mTimerList = new ArrayList<TimerTaskItem>();//存放定时器任务的列表
  protected boolean bIsRun = true; //是否运行
  public void cancel(){
   //取消定时器执行的方法
    this.bIsRun = false;
  }
  //添加定时器
  @param timerTask      执行定时任务的实现类
  @param iPeriodTime    执行各后续任务之间的时间间隔(毫秒)
  @param iStartDelayTime开始执行定时任务的延迟时间(毫秒)
  public void addTimer(ITimerTask timerTask,long iPeriodTime,long iStartDelayTime){
   
    TimerTaskItem timerTaskItem = new TimerTaskItem();//单个任务
    timerTaskItem.timerTask = timerTask; 
    timer.iPeriodTime = iPeriodTime; 
    timer.iNextTriggerTime=System.currentTimeMillis()+iStartDelayTime+iPeriodTime; 
    this.mTimerList.add(timerTaskItem);
  }
  public void run(){
   
    while(bIsRun){
   //线程是否已运行
      Thread.sleep(5);
      synchronized(this.mTimerList){
   
       long currTIme = System.currentTimeMillis();
       for(int i = 0; I < this.mTimerList.size(); i++){
   //遍历任务列表
         TimerTaskItem task = this.mTimerList.get(i);
         if(task. bIsRun){
   
          if(task!=null&&currTime>= task.iNextTriggerTime){
   //判断执行时间
            task.timerTask.doTimerTask();//调用任务对应执行类的执行方法执行任务
            task.iNextTriggerTime=System.currentTimeMillis()+task.iPeriodTime;
          }
         }
       }
      }
    }
  }
}

三. ⭐⭐⭐Java自带原生定时器🌙🌙🌙

Java自带原生定时器主要有以下几个类:
Timer定时器
TaskQueue 定时任务队列类
TimerTask[] queue存放定时任务的数组、
TimerThread extends Thread定时器处理线程(循环处理任务数组里最先需要执行的任务)
TimerTask implements Runnable定时任务抽象类(定义任务要执行的方法)
代码实现如下:

package unittest;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import unittest.util.CommUtil;
public class TestLocal{
   
    public static void main(String[] args) throws InterruptedException {
   
        Timer timer = new Timer();//定义定时器,会初始化存放任务队列的TaskQueue queue和定时器任务处理线程TimerThread thread,并启动thread
        TimerTask timerTask1 = new TimerTask(){
   //创建定时器任务1
            public void run(){
   //任务1方法
                CommUtil.sysPrintInfo("timerTask1");
            }
        };
        TimerTask timerTask2 = new TimerTask(){
   //创建定时器任务2
            public void run(){
   //任务2方法
                CommUtil.sysPrintInfo("timerTask2");
            }
        };
        int period = 2*1000;
        Date firstTime = new Date(System.currentTimeMillis()+period);
        CommUtil.sysPrintInfo("start");
        timer.schedule(timerTask1, firstTime, period);//制定任务1定时执行计划
        timer.schedule(timerTask2, firstTime, period); //制定任务2定时执行计划
        timerTask1.cancel();//取消timerTask1任务执行
        timerTask2.cancel();//取消timerTask2任务执行
        timer.cancel();////取消定时器所有任务的执行
    }
}
目录
相关文章
|
16天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
16天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
1月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
50 14
|
2月前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
|
2月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
32 2
|
2月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
53 1
|
2月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
27 1
|
2月前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
19 1
|
2月前
|
Java
让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
49 1
|
2月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
47 3