W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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ù) | 描述 |
---|---|
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。 |
修飾符和類型 | 方法 | 描述 |
---|---|---|
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 |
public Timer()
創(chuàng)建一個(gè)新的計(jì)時(shí)器。 關(guān)聯(lián)的線程沒有 Thread#setDaemon。
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。 |
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 為空 |
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 為空 |
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ù)為空 |
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í)間為空 |
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ù)為空 |
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 |
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 |
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 |
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)用無效。
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ù)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: