[英]Java: Timer and thread it creates
我有這個問題:
我有一個計時器。 使用scheduleAtFixedRate,它會創建一個新的Timer任務。 在該計時器任務中有某些代碼,可能需要一段時間才能完成。 如何在前一個任務尚未完成時確保Timer不會創建新任務?
謝謝
我的答案是不使用Timer
,它已經過時了。 自Java5以來, Timer
已被ScheduledExecutorService
取代,后者更靈活,更易於使用。 您可以更好地控制調度程序的工作方式,即Timer
無法實現的控制。
您可以使用Executors工廠類創建一個工廠類,該工廠類具有許多工廠方法。 您應該關注的是newSingleThreadScheduledExecutor ,它應該完全符合您的要求:
創建一個單線程執行程序,可以調度命令在給定的延遲后運行,或者定期執行。 保證任務按順序執行,並且在任何給定時間不會有多個任務處於活動狀態。
使用ScheduledExecutorService
,而不是子類化TimerTask
,直接將Runnable
子類化,然后將任務提交給執行程序。 執行程序有各種方法,你需要選擇哪一種方法適合你的需要(仔細閱讀ScheduledExecutorService
的javadoc),但要點是這樣的:
// initialise the executor
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
while (tasksRemaining) {
// create your task
Runnable task = ....;
// submit it to the executor, using one of the various scheduleXYZ methods
executor.schedule(task, delay, unit);
}
// when everything is finished, shutdown the executor
executor.shutdown();
像往常一樣,閱讀javadoc。
Timer類的doc
對應於每個Timer對象的是一個后台線程,用於按順序執行所有計時器的任務。 計時器任務應該快速完成。 如果計時器任務花費過多時間來完成,它會“占用”計時器的任務執行線程。 反過來,這可以延遲后續任務的執行,后續任務可以在緊急任務最終完成時(以及如果)快速連續地“聚集”並執行。
表明只有一個后台主題。 所以我相信這種情況不會發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.