鴻蒙OS Timer

2022-08-09 14:02 更新

Timer

java.lang.Object

|---java.util.Timer

public class Timer
extends Object

線程調(diào)度任務以供將來在后臺線程中執(zhí)行的工具。 任務可以安排為一次性執(zhí)行,或定期重復執(zhí)行。

對應于每個 Timer 對象的是單個后臺線程,用于按順序執(zhí)行所有計時器的任務。 定時器任務應該很快完成。 如果一個定時器任務花費了過多的時間來完成,它就會“占用”定時器的任務執(zhí)行線程。 反過來,這可以延遲后續(xù)任務的執(zhí)行,這些任務可能會在(如果)有問題的任務最終完成時“聚集”并快速連續(xù)執(zhí)行。

在對 Timer 對象的最后一個實時引用消失并且所有未完成的任務都已完成執(zhí)行后,計時器的任務執(zhí)行線程優(yōu)雅地終止(并成為垃圾回收的對象)。 但是,這可能需要任意長的時間才能發(fā)生。 默認情況下,任務執(zhí)行線程不作為守護線程運行,因此它能夠防止應用程序終止。 如果調(diào)用者想要快速終止定時器的任務執(zhí)行線程,調(diào)用者應該調(diào)用定時器的取消方法。

如果計時器的任務執(zhí)行線程意外終止,例如,因為調(diào)用了它的 stop 方法,那么任何進一步嘗試在計時器上安排任務都將導致 IllegalStateException,就像調(diào)用了計時器的取消方法一樣。

這個類是線程安全的:多個線程可以共享一個 Timer 對象而不需要外部同步。

此類不提供實時保證:它使用 Object.wait(long) 方法安排任務。

Java 5.0 引入了 java.util.concurrent 包,其中的并發(fā)實用程序之一是 ScheduledThreadPoolExecutor,它是一個線程池,用于以給定的速率或延遲重復執(zhí)行任務。 它實際上是 Timer/TimerTask 組合的更通用替代品,因為它允許多個服務線程,接受各種時間單位,并且不需要子類化 TimerTask(只需實現(xiàn) Runnable)。 使用一個線程配置 ScheduledThreadPoolExecutor 使其等效于 Timer。

實施說明:此類可擴展到大量并發(fā)計劃任務(數(shù)千個應該沒有問題)。 在內(nèi)部,它使用二進制堆來表示其任務隊列,因此調(diào)度任務的成本為 O(log n),其中 n 是并發(fā)調(diào)度的任務數(shù)。

實現(xiàn)說明:所有構(gòu)造函數(shù)都啟動一個計時器線程。

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
Timer() 創(chuàng)建一個新的計時器。
Timer(boolean isDaemon) 創(chuàng)建一個新的計時器,其關聯(lián)線程可以指定給 Thread#setDaemon。
Timer(String name) 創(chuàng)建一個新的計時器,其關聯(lián)線程具有指定的名稱。
Timer(String name, boolean isDaemon) 創(chuàng)建一個新的計時器,其關聯(lián)線程具有指定的名稱,并且可以指定給 Thread#setDaemon。

方法總結(jié)

修飾符和類型 方法 描述
void cancel() 終止此計時器,丟棄任何當前計劃的任務。
int purge() 從此計時器的任務隊列中刪除所有已取消的任務。
void schedule(TimerTask task, long delay) 安排指定任務在指定延遲后執(zhí)行。
void schedule(TimerTask task, long delay, long period) 安排指定任務以重復固定延遲執(zhí)行,在指定延遲后開始。
void schedule(TimerTask task, Date time) 安排指定任務在指定時間執(zhí)行。
void schedule(TimerTask task, Date firstTime, long period) 從指定時間開始,安排指定任務以重復固定延遲執(zhí)行。
void scheduleAtFixedRate(TimerTask task, long delay, long period) 安排指定任務以重復固定速率執(zhí)行,在指定延遲后開始。
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 從指定時間開始,安排指定任務以重復固定速率執(zhí)行。
從類 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

構(gòu)造函數(shù)詳細信息

Timer

public Timer()

創(chuàng)建一個新的計時器。 關聯(lián)的線程沒有 Thread#setDaemon。

Timer

public Timer(boolean isDaemon)

創(chuàng)建一個新的計時器,其關聯(lián)線程可以指定給 Thread#setDaemon。 如果計時器將用于安排重復的“維護活動”,則調(diào)用守護線程,只要應用程序正在運行,就必須執(zhí)行該活動,但不應延長應用程序的生命周期。

參數(shù):

參數(shù)名稱 參數(shù)描述
isDaemon 如果關聯(lián)的線程應該作為守護進程運行,則為 true。

Timer

public Timer(String name)

創(chuàng)建一個新的計時器,其關聯(lián)線程具有指定的名稱。 關聯(lián)的線程沒有 Thread#setDaemon。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 關聯(lián)線程的名稱

Throws:

Throw名稱 Throw描述
NullPointerException 如果 name 為空

Timer

public Timer(String name, boolean isDaemon)

創(chuàng)建一個新的計時器,其關聯(lián)線程具有指定的名稱,并且可以指定給 Thread#setDaemon。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 關聯(lián)線程的名稱
isDaemon 如果關聯(lián)的線程應該作為守護進程運行,則為 true

Throws:

Throw名稱 Throw描述
NullPointerException 如果 name 為空

方法詳情

schedule

public void schedule(TimerTask task, long delay)

安排指定任務在指定延遲后執(zhí)行。

參數(shù):

參數(shù)名稱 參數(shù)描述
task 要安排的任務。
delay 任務執(zhí)行前的延遲毫秒數(shù)。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果延遲為負,或延遲 + System.currentTimeMillis() 為負。
IllegalStateException 如果任務已被安排或取消,定時器被取消,或定時器線程終止。
NullPointerException 如果任務為空

schedule

public void schedule(TimerTask task, Date time)

安排指定任務在指定時間執(zhí)行。 如果時間是過去,則安排任務立即執(zhí)行。

參數(shù):

參數(shù)名稱 參數(shù)描述
task 要安排的任務。
time 執(zhí)行任務的時間。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果 time.getTime() 是負數(shù)。
IllegalStateException 如果任務已被安排或取消,定時器被取消,或定時器線程終止。
NullPointerException 如果任務或時間為空

schedule

public void schedule(TimerTask task, long delay, long period)

安排指定任務以重復固定延遲執(zhí)行,在指定延遲后開始。 隨后的執(zhí)行以大約固定的時間間隔進行,間隔指定的時間段。

在固定延遲執(zhí)行中,每次執(zhí)行都是相對于前一次執(zhí)行的實際執(zhí)行時間安排的。 如果由于任何原因(例如垃圾收集或其他后臺活動)延遲執(zhí)行,則后續(xù)執(zhí)行也會延遲。 從長遠來看,執(zhí)行頻率一般會略低于指定周期的倒數(shù)(假設系統(tǒng)時鐘底層 Object.wait(long) 是準確的)。

固定延遲執(zhí)行適用于需要“順利”的重復活動。 換句話說,它適用于在短期內(nèi)保持頻率準確比在長期內(nèi)更重要的活動。 這包括大多數(shù)動畫任務,例如定期閃爍光標。 它還包括響應人工輸入執(zhí)行常規(guī)活動的任務,例如只要按住一個鍵就自動重復一個字符。

參數(shù):

參數(shù)名稱 參數(shù)描述
task 要安排的任務。
delay 任務執(zhí)行前的延遲毫秒數(shù)。
period 連續(xù)任務執(zhí)行之間的時間(以毫秒為單位)。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果延遲 < 0,或延遲 + System.currentTimeMillis() < 0,或周期 <= 0
IllegalStateException 如果任務已被安排或取消,定時器被取消,或定時器線程終止。
NullPointerException 如果任務為空

schedule

public void schedule(TimerTask task, Date firstTime, long period)

從指定時間開始,安排指定任務以重復固定延遲執(zhí)行。 隨后的執(zhí)行以大約固定的時間間隔進行,間隔指定的時間段。

在固定延遲執(zhí)行中,每次執(zhí)行都是相對于前一次執(zhí)行的實際執(zhí)行時間安排的。 如果由于任何原因(例如垃圾收集或其他后臺活動)延遲執(zhí)行,則后續(xù)執(zhí)行也會延遲。 從長遠來看,執(zhí)行頻率一般會略低于指定周期的倒數(shù)(假設系統(tǒng)時鐘底層 Object.wait(long) 是準確的)。 作為上述的結(jié)果,如果預定的第一次是過去的,則預定立即執(zhí)行。

固定延遲執(zhí)行適用于需要“順利”的重復活動。 換句話說,它適用于在短期內(nèi)保持頻率準確比在長期內(nèi)更重要的活動。 這包括大多數(shù)動畫任務,例如定期閃爍光標。 它還包括響應人工輸入執(zhí)行常規(guī)活動的任務,例如只要按住一個鍵就自動重復一個字符。

參數(shù):

參數(shù)名稱 參數(shù)描述
task 要安排的任務。
firstTime 第一次執(zhí)行哪個任務。
period 連續(xù)任務執(zhí)行之間的時間(以毫秒為單位)。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果 firstTime.getTime() < 0,或 period <= 0
IllegalStateException 如果任務已被安排或取消,定時器被取消,或定時器線程終止。
NullPointerException 如果 task 或 firstTime 為 null

scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

安排指定任務以重復固定速率執(zhí)行,在指定延遲后開始。 隨后的執(zhí)行以大約固定的時間間隔進行,間隔指定的時間段。

在固定速率執(zhí)行中,每次執(zhí)行都是相對于初始執(zhí)行的計劃執(zhí)行時間安排的。 如果由于任何原因(例如垃圾收集或其他后臺活動)延遲了執(zhí)行,則會快速連續(xù)發(fā)生兩次或更多執(zhí)行以“趕上”。 從長遠來看,執(zhí)行頻率將恰好是指定周期的倒數(shù)(假設 Object.wait(long) 底層的系統(tǒng)時鐘是準確的)。

固定速率執(zhí)行適用于對絕對時間敏感的重復活動,例如每小時整點響鈴,或每天在特定時間運行定期維護。 它也適用于執(zhí)行固定執(zhí)行次數(shù)的總時間很重要的重復活動,例如每秒滴答一次、持續(xù) 10 秒的倒計時計時器。 最后,固定速率執(zhí)行適用于調(diào)度多個必須彼此保持同步的重復計時器任務。

參數(shù):

參數(shù)名稱 參數(shù)描述
task 要安排的任務。
delay 任務執(zhí)行前的延遲毫秒數(shù)。
period 連續(xù)任務執(zhí)行之間的時間(以毫秒為單位)。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果延遲 < 0,或延遲 + System.currentTimeMillis() < 0,或周期 <= 0
IllegalStateException if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.
NullPointerException if task is null

scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

從指定時間開始,安排指定任務以重復固定速率執(zhí)行。 隨后的執(zhí)行以大約固定的時間間隔進行,間隔指定的時間段。

在固定速率執(zhí)行中,每次執(zhí)行都是相對于初始執(zhí)行的計劃執(zhí)行時間安排的。 如果由于任何原因(例如垃圾收集或其他后臺活動)延遲了執(zhí)行,則會快速連續(xù)發(fā)生兩次或更多執(zhí)行以“趕上”。 從長遠來看,執(zhí)行頻率將恰好是指定周期的倒數(shù)(假設 Object.wait(long) 底層的系統(tǒng)時鐘是準確的)。 由于上述原因,如果計劃的第一次是在過去,那么任何“錯過”的執(zhí)行都將被安排立即“趕上”執(zhí)行。

固定速率執(zhí)行適用于對絕對時間敏感的重復活動,例如每小時整點響鈴,或每天在特定時間運行定期維護。 它也適用于執(zhí)行固定執(zhí)行次數(shù)的總時間很重要的重復活動,例如每秒滴答一次、持續(xù) 10 秒的倒計時計時器。 最后,固定速率執(zhí)行適用于調(diào)度多個必須彼此保持同步的重復計時器任務。

參數(shù):

參數(shù)名稱 參數(shù)描述
task 要安排的任務。
firstTime 第一次執(zhí)行哪個任務。
period 連續(xù)任務執(zhí)行之間的時間(以毫秒為單位)。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果 firstTime.getTime() < 0 或 period <= 0
IllegalStateException 如果任務已被安排或取消,定時器被取消,或定時器線程終止。
NullPointerException 如果 task 或 firstTime 為 null

cancel

public void cancel()

終止此計時器,丟棄任何當前計劃的任務。 不干擾當前正在執(zhí)行的任務(如果存在)。 一旦定時器被終止,它的執(zhí)行線程就會優(yōu)雅地終止,并且不能在其上安排更多的任務。

請注意,從由此計時器調(diào)用的計時器任務的 run 方法中調(diào)用此方法絕對保證正在進行的任務執(zhí)行是此計時器將執(zhí)行的最后一個任務執(zhí)行。

該方法可能會被重復調(diào)用; 第二次和后續(xù)調(diào)用無效。

purge

public int purge()

從此計時器的任務隊列中刪除所有已取消的任務。 調(diào)用此方法對計時器的行為沒有影響,但會從隊列中消除對已取消任務的引用。 如果沒有對這些任務的外部引用,它們就有資格進行垃圾回收。

大多數(shù)程序不需要調(diào)用這個方法。 它專為取消大量任務的罕見應用程序而設計。 調(diào)用此方法是以時間換空間:該方法的運行時間可能與 n + c log n 成正比,其中 n 是隊列中的任務數(shù),c 是取消的任務數(shù)。

請注意,允許在此計時器上安排的任務中調(diào)用此方法。

返回:

從隊列中刪除的任務數(shù)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號