Java中的定时器Timer
java.util.Timer是一个实用工具类,该类用来调度一个线程,使线程可以在将来某一时刻开始执行。 Java的Timer类可以调度一个线程运行一次,或定期运行。
java.util.TimerTask是一个抽象类,它实现了Runnable接口。我们可以扩展这个类来创建自己的TimerTask,这个TimerTask内部使用java Timer类,可以被调度。
Timer类是线程安全的,多线程不需要外部同步机制就可以共享同一个Timer对象。Timer类使用java.util.TaskQueue在指定时间间隔添加任务,在任何时刻只能有一个线程执行TimerTask。例如,创建一个每10秒运行的Timer,但单个线程的执行时间花费20秒,Timer对象将持续将线程添加到队列,一旦有线程结束,它就会通知队列,并且另外一个线程将启动执行。
Timer类使用对象的wait和notify方法来调度线程。
如下是一个使用Timer和TimerTask的实例:
package Thread; import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; public class TimerTest { public static void main(String[] args){ Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){ @Override
public void run()
{ System.out.println("Timer task started at:"+new Date());
try
{
Thread.sleep(20*1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Timer task finished at:"+new Date());
} }, 0, 10*1000);
System.out.println("TimerTask started");
try
{
Thread.sleep(120*1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try
{
Thread.sleep(30*1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
注意,一个线程执行花费20秒,但Timer对象每10秒就调度一次任务。如下是程序的输出。
TimerTask started
Timer task started at:Fri Mar 04 16:04:13 CST 2016
Timer task finished at:Fri Mar 04 16:04:33 CST 2016
Timer task started at:Fri Mar 04 16:04:33 CST 2016
Timer task finished at:Fri Mar 04 16:04:53 CST 2016
Timer task started at:Fri Mar 04 16:04:53 CST 2016
Timer task finished at:Fri Mar 04 16:05:13 CST 2016
Timer task started at:Fri Mar 04 16:05:13 CST 2016
Timer task finished at:Fri Mar 04 16:05:33 CST 2016
Timer task started at:Fri Mar 04 16:05:33 CST 2016
Timer task finished at:Fri Mar 04 16:05:53 CST 2016
Timer task started at:Fri Mar 04 16:05:53 CST 2016
TimerTask cancelled
Timer task finished at:Fri Mar 04 16:06:13 CST 2016
输出结果证实,如果一个线程(指继承于TimerTask的线程)正在执行,Timer将等待它执行结束,一旦该线程执行结束,Timer对象将立即启动队列中的下一个线程。
Timer对象可作为一个守护线程(即后台线程Daemon Thread)运行相关的任务。Timer的cancel()方法用于终止计时器,并丢弃待调度的线程。然而,Timer不会干扰当前执行的线程,并且让它执行结束(最后一条在TimerTask cancelled之后输出)。如果计时器用于执行守护线程,无论是否取消它,它都会等待所有用户线程结束后终止。
Timer类包含一些sechedule()方法用于调度一个线程在指定时间运行一次或者延时之后运行,还有一些scheduleAtFixedRate()方法用于在一定间隔后周期运行线程。
当使用Timer调度线程时,必须确保调度的时间间隔超过线程的正常运行时间,否则任务队列的大小将持续增长,最终程序将无法停止。
原文链接: journaldev 翻译: ImportNew.com - liken
译文链接: http://www.importnew.com/9978.html
[ 转载请保留原文出处、译者和译文链接。]
Java中的定时器Timer的更多相关文章
- Java队列和定时器Timer
一: Queue详解 Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...
- python中实现定时器Timer
实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...
- java中一些定时器的使用
一:简单说明 ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便. ...
- Python--day41--threading中的定时器Timer
定时器Timer:定时开启线程 代码示例: #定时开启线程 import time from threading import Timer def func(): print('时间同步') #1-3 ...
- Java内置定时器Timer
Timer是Java内置的一个定时任务,类似于JavaScript里面的setTimeout()和setInterval()方法,可以延迟一定的时间执行任务,也可以按时间间隔重复执行任务. Timer ...
- java中的定时器
所有类型的 Java 应用程序一般都需要计划重复执行的任务.企业应用程序需要计划每日的日志或者晚间批处理过程.一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间.不过,标准的调度 ...
- 线程中的定时器Timer类
Timer 定时器 几分钟之后执行一个任务. 创建了一个定时器相当于开启了一条线程,TimerTask相当于一个线程的任务.内部使用wait/notify机制来实现的. 用法非常的简单 就足以里面的 ...
- [ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!
作为入门者来说.了解JavaScript中timer的工作方式是非常重要的.通常它们的表现行为并非那么地直观,而这是由于它们都处在一个单一线程中.让我们先来看一看三个用来创建以及操作timer的函数. ...
- java中 Spring 定时器定时任务Quartz的正确使用方法集配置
定时任务我想大家都不默认,现在流行的框架spring就带了定时任何 我的个人网站(http://www.yzcopen.com)上用户上传的文件都是用这套定时任务执行定时清除 第一步:在applica ...
随机推荐
- DirectX 文本绘制
在Direct中进行文本绘制,可以通过Win32程序框架实现,也可以通过DXUT进行绘制. 基于第一篇的Win32框架入门实现非常简单,只需要添加数行代码即可.主要说需要修改的地方. #pragma ...
- Magento中,调用静态块的几种方法
在后台创建一个order_form静态块Block Title :Order FormIdentifier :order_formStatus :EnabledContent :自定义内容 1.如果要 ...
- Redis 3.0 集群搭建
Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...
- Windows 10下Chrome不能启动的问题
不能启动了 Chrome突然不能启动了,点击图标也没反应,打开任务管理器,发现点击图标后,Google Ghrome短暂地出现,随即消失. 如何解决? 解决方案 打开安装目录: C:\Program ...
- Trinity 安装
http://trinityrnaseq.github.io/ 安装包下载地址: https://github.com/trinityrnaseq/trinityrnaseq/releases 解压 ...
- 双系统安装要点 - imsoft.cnblogs
1.用磁盘工具 取消当前激活分区,并隐藏当前激活分区2.按照普通的形式安装系统 Ghost安装和简单安装都可以3用修复启动项工具 修复之前处隐藏的系统启动项 OK,再就不会看到烦人的蓝屏了!
- html5中新的标准属性
属性 值 描述accesskey ...
- arraylist 转json
java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException 标签: cla ...
- URAL-1989 Subpalindromes(单点更新+hash)
题目大意:给一行字符串,两种操作:change(pos,char),将pos处字符改为char:isPalindrome(i,j),询问[i,j]之间是否为回文字符串. 题目分析:做正反两次字符串哈希 ...
- MySql的FIND_IN_SET()查询函数的使用
表 table的结构如下: id title 1 12,21 2 21,32 3 45,21,78 4 221,45,74 5 34,421,121 6 52,21,321 现在用sql语句查出来字段 ...