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的更多相关文章

  1. Java队列和定时器Timer

       一: Queue详解    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构    Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...

  2. python中实现定时器Timer

    实现定时器最简单的办法是就是循环中间嵌time.sleep(seconds), 这里我就不赘述了 # encoding: UTF-8 import threading #Timer(定时器)是Thre ...

  3. java中一些定时器的使用

    一:简单说明 ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便. ...

  4. Python--day41--threading中的定时器Timer

    定时器Timer:定时开启线程 代码示例: #定时开启线程 import time from threading import Timer def func(): print('时间同步') #1-3 ...

  5. Java内置定时器Timer

    Timer是Java内置的一个定时任务,类似于JavaScript里面的setTimeout()和setInterval()方法,可以延迟一定的时间执行任务,也可以按时间间隔重复执行任务. Timer ...

  6. java中的定时器

    所有类型的 Java 应用程序一般都需要计划重复执行的任务.企业应用程序需要计划每日的日志或者晚间批处理过程.一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间.不过,标准的调度 ...

  7. 线程中的定时器Timer类

    Timer 定时器 几分钟之后执行一个任务. 创建了一个定时器相当于开启了一条线程,TimerTask相当于一个线程的任务.内部使用wait/notify机制来实现的. 用法非常的简单  就足以里面的 ...

  8. [ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

    作为入门者来说.了解JavaScript中timer的工作方式是非常重要的.通常它们的表现行为并非那么地直观,而这是由于它们都处在一个单一线程中.让我们先来看一看三个用来创建以及操作timer的函数. ...

  9. java中 Spring 定时器定时任务Quartz的正确使用方法集配置

    定时任务我想大家都不默认,现在流行的框架spring就带了定时任何 我的个人网站(http://www.yzcopen.com)上用户上传的文件都是用这套定时任务执行定时清除 第一步:在applica ...

随机推荐

  1. SWUST0249 (凸包面积)

    type node=record x,y:longint; end; ; var k,q,qq:longint; sum:double; f,g:..maxn] of node; m,i,j,a,b: ...

  2. ajax 外部变量

    1.一般的js代码可以放在任何位置.但是用jquery写的代码需要先引入jquery文件,再写代码. 2.ajax函数中内部的变量不能传到外部.如果改变外部变量,需要async:false,代码如下: ...

  3. Disable Portrait in app

    I had this problem as well as I wanted to constrain my game to only landscape mode. I put this in my ...

  4. magento性能优化

    magento性能优化 14个快速加载web页面的技巧: 减少HTTP请求数使用CDN增加过期头信息gzip压缩传输内容将css样式表放在页首将js文件放在页尾不使用css表达式尽量少用内联式的css ...

  5. Python编程小记

    发现这种结构很实用: while True: expression .... if condition: expression break 好吧,我承认我是菜鸟-

  6. oledb 写入 office2010 以及发布到iis 遇到的奇怪问题总结

    这段时间在做Excel 导出升级,把之前的office2003 升级到 2010导出. 一 利用oledb 写入 Excel 2010 的时候,怎么也打不开文件,最后调查的原因是 需要修改连接字符串: ...

  7. 关于kinect的安装与配置工作

    一 关于kinect的安装与配置工作 首先要注意的是,使用kinect进行开发,目前有两种不同的驱动方案,经测试这两种方案的驱动是不能兼容的,所以请务必选定其中一种(最好是卸载另外一种). 方案一:使 ...

  8. DEDE调用频道封面{dede:field:content/}内容方法

    DEDE怎样在首页调用频道封面页{dede:field:content/}内容的方法,当我们用 织梦DEDECMS 做网站的时候,首页往往会加上关于我们或者企业简介之类的文字,在栏目里 当我们用织梦D ...

  9. FZU-2216 The Longest Straight (二分枚举)

    题目大意:给n个0~m之间的数,如果是0,那么0可以变为任意的一个1~m之间的一个数.从中选出若干个数,使构成一个连续的序列.问能构成的最长序列的长度为多少? 题目分析:枚举连续序列的起点,二分枚举二 ...

  10. How to Configure the Gradient Boosting Algorithm

    How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...