關於Timer和TimerTask實驗測試

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

相關文章
相關標籤/搜索