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. 简单的JS运动封装实例---侧栏分享到

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. linux 将debug信息重定向到LCD(屏幕)

    /*********************************************************************** * linux 将debug信息重定向到LCD(屏幕) ...

  3. 不要在类的函数中使用static字段

    昨天在做存储服务的压力测试,后台是采用多线程根据玩家唯一标识做线程划分的,在测试的过程中发现,进行存储的时候,会发生玩家数据错乱的情况. 一开始怀疑是上层逻辑在处理数据的时候发生了错乱,导致保存的时候 ...

  4. python字典中的元素类型

    python字典默认的是string item={"browser " : 'webdriver.irefox()', 'url' : 'http://xxx.com'} 如果这样 ...

  5. Generic Netlink详解

    netlink socket是一种用于用户态进程和内核态进程之间的通信机制.它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯连接. Netl ...

  6. Core Java Volume I — 3.5. Operators

    3.5. OperatorsThe usual arithmetic operators +, -, *, / are used in Java for addition, subtraction, ...

  7. CGI实现页面的动态生成

    传统的Web应用开发局限于有限的静态页面(HTML静态页面),不利于系统的扩展,不能提供及时信息,而且修改维护麻烦,所以建立一个动态Web应用程序尤为重要.一方面根据访问者的不同请求返回不同的访问信息 ...

  8. iOS学习笔记---oc语言第五天

    字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key- ...

  9. db2 字符串转换 数字

    今天使用聚合函数的时候 发现 varchar类型的是不可用的,所以呢就开始想办法解决 用到了转换函数cast(s.score as bigint) 然后有一个问题就是如果数据为空的话就会发生转换错误. ...

  10. 用java将excel表格中的内容修改后写入到另一个excel中

    package nn; import java.io.File; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl. ...