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一个. 不知道各位大虾有没有更好的办法呢.
附件是整个类的代码,有兴趣的话就看看吧. +_+