在未来某个指定的时间点或者经过一段时间延迟后执行某个事件,这时候就需要用到定时器了。定时器的实现方式有很多种,今天总结最简单的实现方式。java 1.3引入了定时器框架,用于在定时器上下文中控制线程的执行,其由类Timer和TimerTask构成。Timer适用于大规模并发调度定时任务,在内部,该类使用二进制的堆表示其定时任务队列。

通过继承TimerTask或者创建匿名类的方式重写run()方法,创建一个定时任务,通过将其作为第一个参数调用Timer得schedule()方法,实现定时器。

import java.util.Timer;
import java.util.TimerTask; public class TimerDemo {
// 通过创建匿名类方式实现 public static void main(String[] args) { // 首先初始化一个TimerTask的匿名子类
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("开始执行");
//退出程序返回最上层,0表示正常退出程序,非0表示非正常退出程序
System.exit(0); }
};
//通过Timer调用
Timer timer = new Timer();
timer.schedule(task, 2000);
}
}

Timer创建的定时器一般为非线程守护,如果想要创建守护线程需调用Timer(boolean isDaemon) 传递参数true给isDaemon。

Timer类声明的方法如下:

  • void schedule(TimerTask task, long delay) 在delay毫秒之后调度任务执行。
  • void schedule(TimerTask task, Date time) 在某个时间点调度任务执行。
  • void schedule(TimerTask task, long delay, long period) 在delay毫秒之后调度任务开始执行,以固定时间间隔的方式重复执行,后续将一大约period毫秒的固定时间间隔执行。
  • void schedule(TimerTask task, Date firstTime, long period) 调度任务于firstTime开始,以固定时间间隔的方式重复执行,后续将一大约period毫秒的固定时间间隔执行。
  • void scheduleAtFixedRate(TimerTask task, long delay, long period) 在delay毫秒之后,开始调度任务以固定速率的方式重复执行,后续将以大约period毫秒数的固定时间间隔执行。
  • void scheduleAtFixedRate(TimerTask task, Date firstTime,long period) 调度任务于firstTime开始,以固定速率的方式重复执行,后续将大约period毫秒数的固定时间间隔执行。

  • sched(TimerTask task, long time, long period) 在指定时间执行调度任务执行,以固定时间间隔的方式重复执行,后续将一大约period毫秒的固定时间间隔执行。
  • void cancel() 终止定时器,丢弃所有当前调度的定时器任务。不干涉当前正在执行的任务,能保证正在执行的任务一定是最后一个被该定时器执行的任务。
  • int purge() 从该定时器队列中移除所有取消的定时任务并且返回被移除任务的数目。

定时任务都是抽象类TimerTask子类的实例,这些子类实现Runnable接口,当子类实例化TimerTask的时候,需要重写其voud run()方法。

TimerTask类声明的方法如下:

  • boolean cancel()取消这个定时任务
  • long scheduledExecutionTime() 返回此定时任务最近实际被调度执行时间。

Timer的cancel()和TimerTask的TimerTask的区别在于,Timer的cancel()会终止定时器并放弃当前任意被调度的定时任务,而TimerTask的cancel()方法仅仅会取消正在调度的定时任务。

定时器实现方式之TimerTask、Timer的更多相关文章

  1. 以+scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?

    这里强调一点:在主线程中以+scheduledTimerWithTimeInterval...的方式触发的timer默认是运行在NSDefaultRunLoopMode模式下的,当滑动页面上的列表时, ...

  2. STM32F103ZET6 用定时器级联方式输出特定数目的PWM

    STM32F103ZET6 用定时器级联方式输出特定数目的PWM STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5.TIM8,共6个. 这里需要使用定时器的级联功能,ST ...

  3. 115、定时器(TimerTask+Timer+Handler)

    public class TimerUtils { public static Activity act; public static List<MaiDianModels> listMa ...

  4. 两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz

    1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportT ...

  5. Java Timer, TimerTask, Timer.Schedule

    schedule的意思(时间表.进度表) timer.schedule(new TimerTask(){ void run()},0, 60*60*1000);timer.schedule(new M ...

  6. 定时器篇---java.util.TimerTask和quartz

    最近项目中出现了定时执行任务的东西,研究了一下,觉得挺不错的,以后还用得到,就总结了下. 这里只介绍两种java.util.Timer 和 quartz java.util.Timer java自带的 ...

  7. STM32F103ZET6 用定时器级联方式输出特定数目的PWM(转载)

    STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5.TIM8,共6个.这里需要使用定时器的级联功能,ST的RM0008 REV12的P388和P399页上有说明对于特定的定 ...

  8. Demonstrating One-Shot Execution TimerTask Timer

    Listing -. Demonstrating One-Shot Execution import java.util.Timer; import java.util.TimerTask; publ ...

  9. Camunda定时器事件示例Demo(Timer Events)

    ​Camunda定时器事件(Timer Events)是由定义的计时器触发的事件.它们可以用作启动事件.中间事件或边界事件.边界事件可以中断,也可以不中断. Camunda定时器事件包括:Timer ...

随机推荐

  1. Windows Server 2008 R2 下 Core界面

    Windows Server 2008 R2 下 Core界面 关于 sc 以及 net 命令 Sc 命令较不全面,仅仅是给服务发送一个开启或者关闭就结束了 Net 命令比较安全,它监视了整个服务的启 ...

  2. gitlab容器--带https配置

    #2.gitlab 重要目录 /home/maks/gitlab/config /etc/gitlab /home/maks/gitlab/logs /var/log/gitlab /home/mak ...

  3. 1.ajax简单实现异步交互

    效果:点击获取信息 testAjax.jsp: <%@ page language="java" contentType="text/html; charset=U ...

  4. Qt for android运行时出错 Error: Target id 'android--1' is not valid

    [提问]windows7下Qt for android运行时出错 Error: Target id 'android--1' is not valid[复制链接] 上一主题下一主题   离线yijun ...

  5. 04. H5标签有哪些?行内元素有哪些?块级元素有哪些?空(void)元素有哪些?行内元素和块级元素有什么区别?你工作中常用标签有什么?

    4. H5标签有哪些? 2)行内元素有哪些? a - 锚点 em - 强调 img - 图片 font - 字体设定 ( 不推荐 ) i - 斜体 input - 输入框 3)块级元素有哪些? add ...

  6. Android Fragment之间的通信(用fragment替换掉XML布局文件中的一个线性布局)

    1.XML布局 (1)主界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  7. Java学习笔记01

    1.原型设计: 将页面的模块.元素.人机交互的形式,利用线框描述的方法,将产品脱离皮肤状态下更加具体跟生动的进行表达. 2.下面的是使用PowerDesigner进行设计的持久层的层次结构图: 虚线三 ...

  8. es6 简单封装一个 省市县三级下拉框

    废话不多说,直接上效果图和代码: 1,index.js function $(el){ return document.getElementById(el) } let render = Symbol ...

  9. Locust 类的使用

     HttpLocust类 可定义多个HttpLocust类,即多个用户可执行不同的任务或者相同的任务,但是执行频率不一样,用weight进行约定. # coding:utf-8 from locust ...

  10. 赋值运算与深浅copy

    1.复制运算 l1 = [1,2,3,['a','b']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['a', 'b']] print(l2) # [1 ...