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 ...
随机推荐
- 使用inno setup打包程序完整脚本(.net框架检测,重复安装检测)
; 脚本由 Inno Setup 脚本向导 生成!; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "小小鸟软件"#def ...
- web app 变革之rem
rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...
- Java Super 覆盖方法
子类从父类中继承方法,有时候,子类需要修改父类中定义的方法的实现,这称作方法覆盖. 比如,GeometricObject类中的toString方法返回表示集合对象的字符串,这个方法就可以被覆盖,返回表 ...
- js foreach比for多出两个undefined
项目中发现,javascript 用foreach会比for多出两个undefined, //会多两个undefined for (var i in _SysFunctions_S) {} //正常 ...
- VIM正则表达式。
看了那个30分钟正则表达式入门.但是是在VIM使用过程中偶尔会出现达不得想要效果的情况.后面百度了下,确然,VIM的正则还是有点区别的. 转自:http://www.cppblog.com/kefen ...
- Java-->多线程复制(文件指针)
--> 这里用到两种方法...其实也不算两种,就一点点不一样而已... ---> Test 测试类 package com.dragon.java.multithreadcopy; imp ...
- mysql导入sql文件过大或连接超时的解决办法
前段时间出差在现场开发的时候,导入数据库老是出问题.最后发现了一个神奇sql语句交给实施,只要导入出错就把如下语句执行就可以了.至今屡试不爽. 1 2 3 4 5 6 7 set global max ...
- java窗口添加背景
1.import javax.swing.ImageIcon; 2.import javax.swing.JFrame; 3.import javax.swing.JLabel; 4.import j ...
- rsync+inotify实现服务器数据同步
一.什么是rsync rsync,remote synchronize是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息.rsync是用 “rsync算 ...
- [USACO11JAN]利润Profits
题目描述 The cows have opened a new business, and Farmer John wants to see how well they are doing. The ...