util和swing中的Timer
阿新 • • 發佈:2018-12-17
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)