簡體   English   中英

Java:它創建的計時器和線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM