Timer: 一種線程設施,用于安排以后在后臺線程中執行的任務。 可安排任務執行一次,或者定期重復執行。
通俗點說就是設定一個時間去執行一次或者重復執行某個任務,例如可以定時提醒用戶去激活軟件,或者該終止軟件的繼續使用
TimerTask:由 Timer 安排為一次執行或重復執行的任務。
該類是實現了Runnable接口
列子:
1.每隔一秒輸出當前時間
(1)首先創建了一個Timer計時器對象,這里使用了Timer(String name)的構造函數
(2)利用Calendar創建一個開始執行的時間
(3)調用Timer類的schedule方法,執行任務。這里給出的Date time參數如果小于當前時間,則會立即執行。(備注:因為schedule方法有很多重載形式,我這里不一一列出,可自行查看API文檔)
(4)重寫TimerTask中的Run方法
public class TimerTest {public static void main(String[] args) {/* * 創建Timer對象: 一種線程設施,用于安排以后在后臺線程中執行的任務。 可安排任務執行一次,或者定期重復執行。 * */Timer tm = new Timer("MyThread");/* * 安排指定的任務 */Calendar cal = Calendar.getInstance();cal.set(2015, 1, 1, 13, 40, 00);tm.schedule(new TimerTask() {@Overridepublic void run() { //輸出線程的名稱,其值為 MyThread System.err.PRintln(Thread.currentThread().getName());while (true) { try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}/* * 輸出每秒時間 */SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD hh:mm:ss");String time = sdf.format(new Date());System.err.println(time);}}}, cal.getTime(), 1000);}}2. 守護線程
主要是解釋一下
(1)要開啟守護線程,應先置于true
(2)守護線程的生命周期,當前臺線程已經結束時,守護線程也跟隨結束,里面的內容也將不會執行
(3)這里的執行結果中,afeter sleep......不會被執行。因為sleep使該線程放棄了CPU的使用權
(4)這里傳入的時間參數為new Date(),即表明是立即執行,所以守護線程的名稱和Before sleep......會被打印,
如果,傳入的參數為1000,也就是1秒鐘,那么守護線程的名稱和Before sleep......也將不會被打印,因為JVM已經認為沒有線程可執行了
public class TimerDaemon_1 { public static void main(String[] args) { //打印主線程名稱 System.out.println(Thread.currentThread().getName()+"............"); //默認值為false final Timer tr = new Timer("MyThread", true); tr.schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()); System.out.println("Before sleep ............"); try { Thread.sleep(1000);// 這里讓該線程休眠1秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("After sleep.............."); }//這里的new Date()表示了立即執行 }, new Date()); }}新聞熱點
疑難解答