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