zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用最小花费爬楼梯
    AVAudioPlayer 如何在页面呈现之后按需初始化
    给 UILabel 中的文字增加 line-through / Strikethrough (删除线)样式
    如何在普通 UIViewController 中使用 UITableView
    如何修改 UINavigationController、UINavigationBar 中 navigationItem 左侧 “返回” 按钮的名称
    在 UIViewController 中手动增加 TableView 出现 Type 'SomeViewController' does not confirm to protocol 'UITableViewDataSource' 问题的解决办法
    iOS 8 录音重放出现 OSStatus error 1685348671 / 2003334207 问题的解决办法
    performSegueWithIdentifier 不生效的解决办法
    AutoLayout 根据文字、图片自动计算 UITableViewCell 高度
    iOS7 UITableView Row Height Estimation
  • 原文地址:https://www.cnblogs.com/softidea/p/4922018.html
Copyright © 2011-2022 走看看