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. wcf例子01

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  2. OpenCV在MFC图像控件内显示图像

    1.依照文章<OpenCV+MFC显示图像>,完毕配置. 2.创建对应的图像控件,button控件. 3.进行类型转换. 在当前OpenCV2版本号内,图像格式为cv::Mat ,而该格式 ...

  3. Directx11学习笔记【十九】 摄像机的实现

    本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/p/5785100.html 之前为了方便观察场景,我们采用的方法是鼠标 ...

  4. Android Java汉字转拼音总结

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23187701 开发过程中有时候会遇到使用拼音模糊搜索等功能(典型的就是Andro ...

  5. CareerCup Chapter 4 Trees and Graphs

    struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...

  6. iOS 辛格尔顿

    单例模式: 为什么使用单例,单例模式的用途是什么?以下我们举一个样例来诠释一下 举个大家都熟知的样例--Windows任务管理器,如图,我们能够做一个这种尝试,在Windows的"任务栏&q ...

  7. phonegap+emberjs+python手机店发展,html5实现本地车类别~

    商城开发项目,现在需要做出APP,无奈出场前android但不是很精通.最后选择phonegap实现app. 由于之前办理购物车分为登陆和登陆后两种情况,登录前必须充分利用本地存储.而基于phoneg ...

  8. String构造函数originalValue.length&gt;size 它发生

    最近观看Jdk6于String源代码被发现String这种施工方法有.源内容如下面: public String(String original) { int size = original.coun ...

  9. iOS如何添加照片模拟器(附带诉讼)

    刚開始做图片选择时,使用了最笨的办法给iphone模拟器添加照片. 方法一:首先打开safari.然后找到图片.点击图片,保存到本地(iphone): 方法二:拖动本地计算机的随意一张照片到iphon ...

  10. 简介Customer Care Accelerator (CCA)

    几个月前,我们发表了CRM4.0的附属插件:Customer Care Accelerator (CCA). 年以来CCA已经存在,我们这些新手在CRM的世界里, Customer Care Fram ...