今天发现一job任务一直在耗cpu,一直没有释放资源,jconsole跟踪发现任务没有真正kill掉,由于job任务里面执行了数据库操做,致使一直锁在了那里,后来经过时间条件来kill掉此任务,使cpu恢复了正常!下面作了个测试:java
import java.util.Timer;
import java.util.TimerTask;
/*
* 说明:该代码主要是说明如何在定时器外部,经过执行时间等条件来中止某些任务
*
*/
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer(); //初始化必定时器
RemindTask rt = new RemindTask();
//定时器将延迟seconds秒开始执行RemindTask这个任务,而后每隔2秒执行一次RemindTask任务
timer.schedule(rt, seconds * 1000, 2000);
//执行的时间超过了5秒,kill掉定时器中的任务 & 定时器
long beginTime = System.currentTimeMillis();
long nowTime = 0L;
while (true) {
nowTime = System.currentTimeMillis();
if (nowTime - beginTime >= 20000) {
rt.cancel();
timer.cancel();
break;
}
}
}
//准备给定时器触发的任务
class RemindTask extends TimerTask {
public void run() {
System.out.println("Time's up!");
//这里能够执行不少操做
}
}
//test here
public static void main(String args[]) {
System.out.println("About to schedule task.");
new Reminder(5);//5秒钟开始执行任务
System.out.println("Task scheduled.");
}
}
关于cancel的说明:
这里面有两种cancel,可是并非cancel掉某个任务,这个任务立刻就中止执行,有下列几种状况:
1、对于rt.cancel();
一、若是任务已经放入定时器里面且只会执行一次,但尚未开始执行或到执行的时间,它将不再会执行了。
二、若是任务已经放入定时器里面且会屡次执行,它将不再会执行了。
三、若是当前cancel的任务正在执行,这个任务将继续执行完,可是在定时器里面不会再执行了,也就是让它把该干的活仍是得干完再去死O(∩_∩)O~数据库
2、对于timer.cancel();
一、这个实际上是终止定时器功能,cancel时将丢弃全部该执行的任务,可是不会干扰当前正在执行的任务。测试
对于上面的两种cancel都是能够重复调用的,因此你们不用担忧重复执行会出错O(∩_∩)O~spa
转自:http://www.ahuoo.com/?p=393code