Javaカスタムタイマー

6038 ワード

Javaカスタムタイマー
多くの場合、データ統計、タスクタイミングなど、タイマを使用して操作する必要があります.しかし、多くの場合、タイミングタスクをキャンセルしたり、時間を再設定したりする必要があるなど、Javaが持参したTimerを使うのは簡単ではない場合があるので、Timerを拡張してカスタムタイマーの効果を実現したいと思っています.タイミングタスクインタフェース:
public interface StartTimer {
    /**
      * startNextTimer
      * @  :         
      * @  : zhuxl
      * @    : 2016 8 29 
      */
    public abstract void startNextTimer();
    /**
      * startTimer
      * @  :      
      * @  : zhuxl
      * @    : 2016 8 29 
      */
    public abstract void startTimer();
    /**
      * stopTimer
      * @  :      
      * @  : zhuxl
      * @    : 2016 8 29 
      */
    public abstract void stopTimer();
    /**
      * restartTimer
      * @  :     
      * @  : zhuxl
      * @    : 2016 8 30 
      */
    public abstract void restartTimer();
}

抽象的な実装:
/**
 *     
 * @author zhuxl
 *
 */
public abstract class StartTimerImpl implements StartTimer {
    /**
     *   
     */
    protected Timer timer;

    @Override
    public void stopTimer() {
        if(timer!=null){
            timer.cancel();
        }

    }
    @Override
    public void restartTimer() {
        startTimer();
    }

}

具体的なタイマー、例えばレポート生成、コードは以下の通りです.


@Component("reportTimer")
public class ReportTimerImpl extends StartTimerImpl{
    private Logger logger=Logger.getLogger(ReportTimerImpl.class);
    @PostConstruct
    public void init(){
        this.startTimer();
    }
    @Override
    public void startNextTimer() {
        if(timer!=null){
            timer.cancel();
            logger.info("       !!");
        }
        timer=new Timer(true);
        Date nextDate=computeNextDate(false);
        if(nextDate==null){
            logger.info("         !!");
            return ;
        }
        logger.info("         ,      :"+nextDate);
        timer.schedule(new ReportTask(),nextDate);
    }
    /**
      * computeNextDate
      * @  :        
      * @  : zhuxl
      * @    : 2016 8 30 
      * @return
      */
    private Date computeNextDate(boolean flag){
        ...
        //         
    }
    @Override
    public void startTimer() {
        if(timer!=null){
            timer.cancel();
            logger.info("       !!");
        }
        timer=new Timer(true);
        Date nextDate=computeNextDate(true);
        if(nextDate==null){
            logger.info("         !!");
            return ;
        }
        logger.info("       ,      :"+nextDate);
        timer.schedule(new ReportTask(),nextDate);
    }
}

使用中にSpringの注釈を使う必要があります!!!ReportTaskは、特定のタイミングタスクです.他のサービスを再起動する必要がある場所でreportTimer.restartTimer()を再起動すればよい.タイマーを閉じるのはreportTimer.stopTimer()です.