博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.util.Timer demo good
阅读量:7238 次
发布时间:2019-06-29

本文共 4311 字,大约阅读时间需要 14 分钟。

 

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,consolelog4j.appender.R1=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.R1.File=log/test.loglog4j.appender.R1.DatePattern='_'yyyy-MM-dd'.log'log4j.appender.R1.layout=org.apache.log4j.PatternLayoutlog4j.appender.R1.layout.ConversionPattern=[%d] [%t] %p - %m%nlog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.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

 

转载于:https://www.cnblogs.com/softidea/p/4922018.html

你可能感兴趣的文章
lecture 3.2 problem set 3
查看>>
4-AI--Activity跳转动画
查看>>
(旧) 1- 大家一起学:Flask构建弹幕微电影网站-(一)-(三)合集:数据模型设计映射成表...
查看>>
vuex组件 vuex-persistedstate
查看>>
靠谱的 关闭Windows10自动更新
查看>>
Ocelot简易教程(二)之快速开始2
查看>>
Elide 4.3.1 发布,雅虎开源的应用数据 API 搭建平台
查看>>
[Docker]Docker镜像
查看>>
如何抓取WebClient、HttpWebRequest、WebRequest无法获取的网页源码,下面将为你解答...
查看>>
[HBase]HBase安装
查看>>
微服务 到底解决了什么问题?非用不可吗?
查看>>
基本概念
查看>>
【Web API系列教程】1.2 — Web API 2中的Action Results
查看>>
Memcached的扩容源码分析
查看>>
DOM操作之--元素的创建,添加,删除
查看>>
关于Vue.js和React.js,听听国外的开发者怎么说?
查看>>
4.variables
查看>>
2.sparkSQL--DataFrames与RDDs的相互转换
查看>>
鼠标放上超链接显示背景效果
查看>>
【小摘抄】关于C++11下 string各类用法(持续更新)
查看>>