今天發現一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