java.util.Timer demo good

 

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

 

posted @ 2015-10-29 22:30  沧海一滴  阅读(346)  评论(0编辑  收藏  举报