近期做项目的时候,用到了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("停止自己定义定时线程"); } }
也在不断完好中。如有发现bug,请一定给出评论!