1. 程式人生 > >util和swing中的Timer

util和swing中的Timer

java.util.Timer和javax.swing.Timer

1.java.util.Timer

計時器工具,是一種執行緒設施,用於安排以後在後臺執行緒中執行的任務。可安排任務執行一次,或者定期重複執行。 預設情況下是一個使用者執行緒(非守護執行緒),所以它能夠阻止應用程式終止,也可自行設定它為守護執行緒(建立Timer物件將引數設定為true)。如果呼叫方想要快速終止計時器的任務執行執行緒,那麼呼叫方應該呼叫計時器的 cancel 方法。

此類是執行緒安全的:多個執行緒可以共享單個 Timer 物件而無需進行外部同步。

  • 建立方法
package oyh;

import java.
util.Timer; import java.util.TimerTask; public class TimerTest { public static void main(String[] args){ /* * 建立Timer物件,其中有個構造引數為boolean值,用來設定執行緒是否為守護執行緒 * 預設情況下是false(使用者執行緒即非守護執行緒) */ Timer timer = new Timer(false); /* * java.util.TimerTask * 由 Timer 安排為一次執行或重複執行的任務。 * * public void schedule(TimerTask task, long delay, long period) * 安排指定的任務從指定的延遲後開始進行重複的固定延遲執行。 * task: 所要安排的任務 * delay: 執行任務前的延遲時間,單位是毫秒。 * period: 執行各後續任務之間的時間間隔,單位是毫秒。 */
timer.schedule(new TimerTask() { //建立一個新的計時器任務。 @Override public void run() { //此計時器任務要執行的操作。 System.out.println("Hello"); } }, 1000, 2000); } }

執行結果:

​ 延遲一秒輸出Hello,之後每隔兩秒輸出一次Hello(由於設定為非守護執行緒,所以main執行結束後無法終止程式,可以通過呼叫cancel()方法 終止此計時器,丟棄所有當前已安排的任務。也可以開始就設定為守護執行緒,使用者執行緒結束,計時器停止 )

2.javax.swing.Timer

也是一種計時器工具,在指定延遲之後激發一個或多個操作事件

  • 建立
package oyh;

import java.awt.*;
import java.awt.event.*;
import java.util.Date;
import javax.swing.*;

public class TimerTest {
	public static void main(String[] args){
//		/*
//		 * 用於接收操作事件的偵聽器介面。
//		 * 使用該類建立的物件可使用元件的 addActionListener 方法向該元件註冊。
//		 * 在發生操作事件時,呼叫該物件的 actionPerformed 方法。
//		 */
//		ActionListener listener = new ActionListener() {
//			/**
//			 * 發生操作時呼叫
//			 */
//			@Override
//			public void actionPerformed(ActionEvent e) {
//				System.out.println("At the tone,the time is"+new Date());
//				//發出一個音訊嘟嘟聲。
//				Toolkit.getDefaultToolkit().beep();
//			}
//		};
//		/*
//		 * 建構函式:public Timer(int delay,ActionListener listener)
//		 * delay: 操作事件之間的毫秒數
//		 * listener: 初始偵聽器;可以為 null
//		 */
//		Timer timer = new Timer(1000, listener);
//		//啟動該 Timer,以使它開始向其偵聽器傳送操作事件。
//		timer.start();
		
		/*
		 * 上面的在JDK8以及以後可以簡寫,此處為最簡寫
		 * 
		 * lambda表示式
		 * JDK8推出的一個特性,可以用來快速便捷的建立匿名內部類
		 * 
		 * 語法
		 * ([arg1,arg2...])->{
		 * 方法體
		 * }
		 * 
		 * 如果方法只有一個引數,而且這個引數型別可以推導得出,那麼甚至還可以省略小括號
		 * lambda表示式的返回值型別總是會由上下文推導得出
		 * 
		 * lambda表示式在建立一個匿名內部類是有一個要求,就是其對應介面必須有且只能有一個抽象方法
		 * 時才可以使用,如果存在很多方法時使用編譯是不通過的
		 */
		new Timer(1000,e->{
			System.out.println("At the tone,the time is:"+new Date());
			Toolkit.getDefaultToolkit().beep();
		}).start();
		
		JOptionPane.showMessageDialog(null, "Quit program");
		System.exit(0);
	}
}

執行結果:

​ 每個十秒鐘,顯示當前時間一次,然後響鈴一次

​ At the tone,the time is:Thu Oct 25 07:13:22 GMT+08:00 2018

3.java.util.Timer和javax.swing.Timer比較

在 1.3 版本中,需要向 Java 平臺新增另一個 Timer 類:java.util.Timer。此類和 javax.swing.Timer 兩者都提供相同的基本功能,但是 java.util.Timer 更常用,功能更多。javax.swing.Timer 有兩個特徵,它們可以讓使用 GUI 更方便。首先,其事件處理程式為 GUI 程式設計師所熟悉並且可以更容易地處理事件指派執行緒。第二,其自動執行緒共享意味著不必採取特殊步驟來避免生成過多執行緒。相反,計時器使用同一個執行緒讓游標閃爍,使工具提示顯示,等等。 (API)