鴻蒙OS Timer

2022-08-09 14:02 更新

Timer

java.lang.Object

|---java.util.Timer

public class Timer
extends Object

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

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

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

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

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

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

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

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

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

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

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

方法總結(jié)

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

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

Timer

public Timer()

創(chuàng)建一個(gè)新的計(jì)時(shí)器。 關(guān)聯(lián)的線程沒有 Thread#setDaemon。

Timer

public Timer(boolean isDaemon)

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

參數(shù):

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

Timer

public Timer(String name)

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

參數(shù):

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

Throws:

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

Timer

public Timer(String name, boolean isDaemon)

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

參數(shù):

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

Throws:

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

方法詳情

schedule

public void schedule(TimerTask task, long delay)

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

參數(shù):

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

Throws:

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

schedule

public void schedule(TimerTask task, Date time)

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

參數(shù):

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

Throws:

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

schedule

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

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

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

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

參數(shù):

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

Throws:

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

schedule

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

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

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

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

參數(shù):

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

Throws:

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

scheduleAtFixedRate

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

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

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

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

參數(shù):

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

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)

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

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

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

參數(shù):

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

Throws:

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

cancel

public void cancel()

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

請(qǐng)注意,從由此計(jì)時(shí)器調(diào)用的計(jì)時(shí)器任務(wù)的 run 方法中調(diào)用此方法絕對(duì)保證正在進(jìn)行的任務(wù)執(zhí)行是此計(jì)時(shí)器將執(zhí)行的最后一個(gè)任務(wù)執(zhí)行。

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

purge

public int purge()

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

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

請(qǐng)注意,允許在此計(jì)時(shí)器上安排的任務(wù)中調(diào)用此方法。

返回:

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)