Java线程之Timer
简述
java.util.Timer是一个定时器,用来调度线程在某个时间执行。在初始化Timer时,开启一个线程循环提取TaskQueue任务数组中的任务,
如果任务数组为空,线程等待直到添加任务;
当添加任务时,唤醒线程,提取数组中标记为1的任务,
如果该任务状态为CANCELLED,则从数组中删除任务,继续循环提取任务
TimerTask
TimerTask是一个抽象类,它实现了Runnable接口,我们需要继承TimerTask来创建自己的任务类,然后可以使用Timer去调度我们自定义的任务类。
Timer是线程安全的,多个线程可以共享一个Timer对象不需要额外加锁。Timer使用java.util.TaskQueue 来存储添加的任务,在任何时间只有一个线程去执行TimerTask,例如,如果您正在创建一个计时器,每10秒运行一次,但是单线程执行需要20秒,计时器对象将继续向队列中添加任务,当一个线程完成后,它将通知队列,另一个线程将开始执行。
Timer对象使用Object对象的 wait 和 notify方法去调度TimerTask去执行的
事例
package com.lkf.mulithread;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Timer task started at:"+new Date());
completeTask();
System.out.println("Timer task finished at:"+new Date());
}
private void completeTask() {
try {
//任务完成需要20秒
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//running timer task as daemon thread
Timer timer = new Timer(true);
//每个10秒调度一次
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//cancel after sometime
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
定时器每隔10秒调度一次任务,一个任务执行时间需要20秒
输出结果:
TimerTask started
Timer task started at:Sun Mar 25 13:20:35 CST 2018
Timer task finished at:Sun Mar 25 13:20:55 CST 2018
Timer task started at:Sun Mar 25 13:20:55 CST 2018
Timer task finished at:Sun Mar 25 13:21:15 CST 2018
Timer task started at:Sun Mar 25 13:21:15 CST 2018
Timer task finished at:Sun Mar 25 13:21:35 CST 2018
Timer task started at:Sun Mar 25 13:21:35 CST 2018
Timer task finished at:Sun Mar 25 13:21:55 CST 2018
Timer task started at:Sun Mar 25 13:21:55 CST 2018
Timer task finished at:Sun Mar 25 13:22:15 CST 2018
Timer task started at:Sun Mar 25 13:22:15 CST 2018
TimerTask cancelled
Timer task finished at:Sun Mar 25 13:22:35 CST 2018
由输出结果可以确认,定时器将等待任务完成,一旦完成,它将再次从队列开始下一个任务
总结
Timer定时器可以作为守护线程对任务进行调度,计时器cancel()方法用于终止计时器并丢弃任何设置好的任务,但是,它不会干扰当前执行的任务,会让它完成。
当Timer定时器作为守护线程,一旦我们调用取消定时器方法,等所有正在执行的用户线程执行完毕,定时器线程将会被终止
定时器类包含多个schedule()方法,用于安排在给定日期或延迟之后运行一次任务,有几个scheduleAtFixedRate()方法在一定时间间隔内运行任务
当我们使用Timer作为定时任务调度器时,要确保调度时间间隔不大于任务运行时间,否则,任务队列大小将持续增长,最终任务将始终执行
另外当多线程并行处理定时任务时,Timer运行多个TimerTask时,只要其中一个任务抛出异常,那么所有的任务都将被终止
Java线程之Timer的更多相关文章
- Java线程之 InterruptedException 异常
Java线程之 InterruptedException 异常 当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...
- Java 多线程之Timer与ScheduledExecutorService
1.Timer管理延时任务的缺陷 a.以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗:然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只 ...
- 多线程之Timer和TimerTask
Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask.TimerTask是一个抽象类,实现了Runnabl ...
- java 线程之executors线程池
一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...
- java 线程之concurrent中的常用工具 CyclicBarrier
一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...
- C++/Java线程之分
JAVA线程状态图 1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭). ----1.1 一个进程中可以有 ...
- Java线程之CompletionService批处理任务
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...
- Java线程之Synchronized用法
synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...
- Java线程之Java内存模型(jmm)
一.Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial
随机推荐
- jvm调试相关:jmap失效下找到alternatives神器
1.使用 jmap <pid>出现的错误日志:很明显是版本问题 Error attaching to process: sun.jvm.hotspot.runtime.VMVersionM ...
- java——多线程知识点大总结
1:理解线程的概念之前,我们有必要先理解一下进程的概念 程序(Program)是为实现特定目标或解决特定问题而用计算机语言(比如Java语言)编写的命令序列的集合. 进程指一个程序的一次执行过程 ...
- c# word excel text转html的方法
首先是预览图片,这个功能很好实现,无非就是创建一个html页面,嵌套一个<img>,为了限制图片类型,可以定义一个允许预览类型数组作为限制: /// <summary> /// ...
- centos7配置rsync+inotify数据实时共享
关于centos7版本上面搭建rsync服务并且实现实时同步之前一直是在6版本上面搭建rsync服务,在7版本上面折腾了半天.此处总结下inotify下载地址:http://github.com/do ...
- Js中去除数组中重复元素的6种方法
方法一: Array.prototype.method1 = function(){ var arr=[]; //定义一个临时数组 for(var i = 0; i < this.length; ...
- 在Markdown中写公式块
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdown中的公式语法是遵循LaTex语法的 $ sum = \sum_{i ...
- java 读取property
Properties prop = new Properties(); String path = AlarmController.class.getResource("/").g ...
- Qt设置按钮为圆形
通过Qt 的样式表实现圆形按钮,其也可以实现圆角按钮,当然也可以使用其他的方式,比如说,通过派生按钮类使用绘图事件,进行一个图形的绘制,或者是通过自定义一个类,通过信号与槽的机制与绘图事件的配合也能实 ...
- 离线下载pytorch安装包
1. 选择合适的安装包下载 https://anaconda.org/pytorch/repo?type=conda&label=main 2. 安装命令: conda install 安装包 ...
- 20、linux启动流程和救援模式
1.Linux启动流程 2.Linux运行级别 1.什么是运行级别,运行级别就是操作系统当前正在运行的功能级别 System V init运行级别 systemd目标名称 作用 0 runlevel0 ...