最近做项目的时候,用到了java.util.Timer定时器类,也初步使用了,个人感觉不错。不过,在某些方面Timer类无法满足项目的需求,比如,在使用Timer时,调用schedule()方法之后(初始化),其循环周期无法改变,只有调用cancel()方法之后再重新启动才能将循环周期改变。 自己自定义了一个定时器线程,可开启、可关闭、可动态的改变循环周期,具体代码如下:
/** * @ClassName: MyTimer * @Description: TODO 自定义定时器类 * @author yc * @date 2014年10月16日 下午10:42:04 */ package com.keymantek.demo; public class MyTimer extends Thread{ //开关控制标志位 public static boolean flag = false; //开始时间 //delay in milliseconds before task is to be executed. public static Long startTime = 1000*3*60L; //循环时间 //time in milliseconds between successive task executions. public static Long period = 1000*5*60L; @Override public void run() { while(true) { try { //开始时间 Thread.sleep(startTime); //只有当flag为true时,才采集相关信息 while(flag) { //业务逻辑处理块 //循环时间 Thread.sleep(period); } //当flag为false时,线程休息中 Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } } }下面是为此线程提供的控制类:
/** * @ClassName: TimerReadElectricityMeterTable * @Description: TODO 自定义定时器线程控制类 * @author yc * @date 2014年10月16日 下午10:41:29 */ package com.keymantek.demo; public class MyTimerController { /** * @category 初始化自定义定时线程 */ public static void initMyTimer() { MyTimer timer= new MyTimer(); timer.start(); System.out.println("初始化自定义定时线程"); } /** * @category 开启自定义定时线程 * @param period 循环时间 */ public static void startMyTimer(Long period) { MyTimer.flag = true; MyTimer.period = period; System.out.println("开启自定义定时线程"); } /** * @category 停止自定义定时线程 */ public static void stopMyTimer() { MyTimer.flag = false; System.out.println("停止自定义定时线程"); } }
原文地址:http://blog.csdn.net/yuechang5/article/details/40157763