package timer;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /*2015-10-29*/
public class JDKTimer {
private static final Logger LOGGER = LoggerFactory.getLogger(JDKTimer.class); public static void main(String[] args) {
Timer timer = new Timer();
LOGGER.info("10秒钟后执行定时器一...");
timer.schedule(new TimerTask() { @Override
public void run() {
LOGGER.info(Thread.currentThread() + ":定时器一执行完毕。。。");
}
}, 10 * 1000); LOGGER.info("60秒后准备执行定时器二。。。");
timer.schedule(new TimerTask() { @Override
public void run() {
LOGGER.info(Thread.currentThread() + ":定时器二执行完毕。。。");
}
}, getNext1Minute()); LOGGER.info("准备执行定时器三。。。");
timer.schedule(new TimerTask() { @Override
public void run() {
LOGGER.info(Thread.currentThread() + ":10秒后再执行定时器三。。。");
}
}, new Date(), 10 * 1000); } private static Date getNext1Minute() {
return new Date(System.currentTimeMillis() + 60 * 1000);
}
}

log4j.properties

log4j.rootLogger=all, R1,console
log4j.appender.R1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R1.File=log/test.log
log4j.appender.R1.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
log4j.appender.R1.layout.ConversionPattern=[%d] [%t] %p - %m%n log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%d] [%t] %p - %m%n

Output:

[2015-10-29 22:28:47,731] [main] INFO - 10秒钟后执行定时器一...
[2015-10-29 22:28:47,731] [main] INFO - 60秒后准备执行定时器二。。。
[2015-10-29 22:28:47,731] [main] INFO - 准备执行定时器三。。。
[2015-10-29 22:28:47,732] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:28:57,733] [Timer-0] INFO - Thread[Timer-0,5,main]:定时器一执行完毕。。。
[2015-10-29 22:28:57,733] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:29:07,733] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:29:17,734] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:29:27,735] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:29:37,736] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:29:47,731] [Timer-0] INFO - Thread[Timer-0,5,main]:定时器二执行完毕。。。
[2015-10-29 22:29:47,736] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:29:57,736] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:30:07,737] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:30:17,737] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:30:27,738] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:30:37,738] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:30:47,739] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:30:57,740] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:31:07,740] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:31:17,741] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:31:27,741] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:31:37,742] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:31:47,746] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:31:57,747] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。
[2015-10-29 22:32:07,748] [Timer-0] INFO - Thread[Timer-0,5,main]:10秒后再执行定时器三。。。

Others:

利用Timer和TimerTask可以实现定时完成某些任务。

但是在运行过程中出现了很奇怪的现象: 所有TimerTask都完成了,按理说程序应该自动退出,但是它却没有!

我以为是Eclipse的bug,然后再cmd下尝试,同样是无法退出。

这种现象在只要new了一个Timer(),就会出现。

奇怪,谷歌了一下,找不到答案,但是找到零星的提问同样的问题的帖子。 还是自己动手看看帮助文档吧。。。

在JDK1.5的文档Timer类中,有这样一句话: “对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。”

但是这个“很长时间”是多长呢?一直等也没见它停止。。。 既然会成为垃圾回收的对象,那么我们就主动让系统回收一下吧。在每个TimerTask的run()方法最后加上一行代码: System.gc(); 然后再运行程序,搞定,正常了。
很自然会想到应该保证在Timer的最后一个TimerTask的最后调用gc(),但是经尝试发现只要在某一个TimerTask中调用过gc(),然后程序就能正常结束。
并且gc()也不必放在最后。

http://blog.csdn.net/liziyun537/article/details/6709572

java.util.Timer demo good的更多相关文章

  1. 使用java.util.Timer来周期性的执行制定的任务

    使用java.util.Timer来周期性的执行制定的任务 public class HandlerTest extends Activity { int[] images = new int[] { ...

  2. java.util.Timer类似于闹钟定时做任务

    在web中实现任务计划,相当于实现闹钟的功能,要完成2个步骤: 1.定时器的设置: 2.对这个定时器的启动运行和停止进行实时监听 java.util.Timer定时器,实际上是个线程,定时调度所拥有的 ...

  3. 任务调度--使用java.util.Timer实现

    任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务. 举个例子,比如说我们希望一个系统每周日晚上9点都将数据库文件备份一次,这时我们就可以使用任务调度来实现.为了更加的方便,我们需要 ...

  4. Java基础复习--java.util.Timer定时任务

    在java中,Timer类主要用于定时性.周期性任务 的触发,这个类中有两个方法比较难理解,那就是schedule和scheduleAtFixedRate方法,在这里就用实例分析一下. (1)sche ...

  5. java.util.Timer简介

    Timer是用于管理在后台执行的延迟任务或周期性任务,其中的任务使用java.util.TimerTask表示.任务的执行方式有两种: 按固定速率执行:即scheduleAtFixedRate的两个重 ...

  6. java.util.regx Demo

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class TestRegex { public stati ...

  7. java.util.Timer分析源码了解原理

    Timer中最主要由三个部分组成: 任务 TimerTask .  任务队列: TaskQueue queue 和 任务调试者:TimerThread thread 他们之间的关系可以通过下面图示: ...

  8. java倒计时使用java.util.Timer实现,使用两个线程,以秒为单位

    public class Countdown3 { private int lin; private int curSec; public Countdown3(int lin)throws Inte ...

  9. java关于Timer schedule执行定时任务 !!!!!!!!!

    1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...

随机推荐

  1. shell split分析日志文件

    在处理的文件comment有如下格式: ............................ xxx.xxx.10.59 db1059 mynbdpdatadb.idc4. dbname R620 ...

  2. trie + 长度优先匹配,生成串

    import com.google.common.collect.Maps; import java.util.Map; /** * tree 节点 * Created by shuly on 16- ...

  3. IIS在W7下使用

    1.0.发布程序

  4. 玩转Web之servlet(五)---- 怎样解决servlet的线程安全问题

    servlet默认是存在线程安全问题的,但是说白了,servlet的线程安全问题实际上就是多线程的线程安全问题,因为servlet恰巧是一个多线程才会出现安全性问题. 浏览器每次通过http协议去提交 ...

  5. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

    写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...

  6. Struts的ONGL

    1.什么是OGNL OGNL它是Object Graphic Navigation Language(对象图导航语言)缩写,    它是一个开源项目. Struts2框架使用OGNL作为默认的表达式语 ...

  7. JTree demo

    JFrame居中方法一:   setLocationRelativeTo(null); 注意:必须在整个frame初始化完成后再加上此语句,否则将显示在屏幕右下角 方法二: private Dimen ...

  8. java编程规范之java命名规范

    想要成为一个优秀的程序员,首先要培养良好的编程习惯,为了提高代码的可读性,必须有好的命名规范. 这篇文章是小编结合网上的很多资料整理出来的,若有不当或错误的地方,欢迎大家指正 在文章开始前,为方便阅读 ...

  9. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  10. STL之容器适配器queue的实现框架

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是怎样借助基础容器实现一种经常使用的数据结构stack (栈),本文介绍下第二种STL ...