使用Timer和TimerTask实现周期任务

      Java中实现周期循环任务的方法应该有不少,不过小菜我呢在这之前可是一样都不怎么用过,今天项目中碰到了这样的需求,只好埋头查文档,现学现用了.

 

      Timer类作为计时器来用, 内部有个queue队列, 包括了所有需要周期循环执行的任务,这些任务对象要求是TimerTask类型. Timer对象实例化的时候,计时器就开始了, 初始的任务队列为空. 

 

      还是根据项目需求来说说具体的用法吧.

 

      项目需求:  实现某一任务的周期执行, 页面上输入任务执行的周期, 提供enable和disable按钮开始和结束周期任务.

 

      这个需求用一个singleton的功能类来实现比较合适, 不过代码有些多,这里就贴一下enable和disable的两个方法吧.

 

Enable:

 

/**
     * Enable auto replication
     *
     * @param period     (ms)
     * @param workerType
     */
    public void enable(long period, int workerType) {
        switch (workerType) {
            case ReplicationWorkerFactory.WorkerTypes.FILE_REPLICATION_WORKER:
                if(filerAutoRelicatorTimer!=null){
                    filerAutoRelicatorTimer.cancel();
                }
                filerAutoRelicatorTimer = new Timer(true);
                filerAutoRelicatorTimer.schedule(new  AutoRelicationTimerTask(ReplicationWorkerFactory.WorkerTypes.FILE_REPLICATION_WORKER),
                        0, period);
                isFilerAutoReplicationRunning = true;
                break;
        }
    }

 

        filerAutoRelicatorTimer是全局的Timer变量, 用于周期任务执行. AutoRelicationTimerTask这个类是

任务执行的类; 每次开始的时候先将原来里面的任务cancle掉再重新设置周期任务, 这样任务不会重复执行.

 

schedule()有好几个重载的方法, 每个方法的具体功能还是翻翻api文档吧.

Disable:

 

 

/**
     * Disable auto replication
     *
     * @param workerType
     * @throws InterruptedException
     */
    public void disable(int workerType) throws InterruptedException {
        switch (workerType) {
            case ReplicationWorkerFactory.WorkerTypes.FILE_REPLICATION_WORKER:
                filerAutoRelicatorTimer.cancel();
                isFilerAutoReplicationRunning = false;
                break;
        }
    }

 

  Disable简单多了,直接调用cancle就OK了. 值得注意的是Timer类不具有象Thread那样的wait和notify的机制, 它本身notify和wait继承自object. 刚开始还想用这两个方法来实现线程池似的机制,不过看来不行了,只能每次定制周期任务

的时候, 就重新new一个. 不知道各位大虾有没有更好的办法呢.

 

       附件是整个类的代码,有兴趣的话就看看吧. +_+

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值