簡體   English   中英

在Java中實現“定時器”的正確方法?

[英]Proper way of implementing “timers” in Java?

我需要在Java代碼中進行一些定期檢查。 有些東西是在不同的線程中執行的,我需要每隔5秒檢查一次,然后每10分鍾檢查一些其他東西,等等。

我該如何在Java中實現這些“計時器”? 我應該循環然后發送線程睡眠一段時間嗎?

這樣做的正確方法是什么?

您應該使用ScheduledThreadPoolExecutor ,它正是這樣做的。

您可能需要考慮使用ExecutorService實現ScheduledThreadPoolExecutorService

根據javadoc

ThreadPoolExecutor,可以額外調度命令在給定延遲后運行,或定期執行。 當需要多個工作線程時,或者當需要ThreadPoolExecutor(此類擴展)的額外靈活性或功能時,此類優於Timer

有很多方法可以做到這一點,我會使用ScheduledExecutorService

ScheduledExecutorService scheduler = ...

final ScheduledFuture<?> fiveSecHandle =
   scheduler.scheduleAtFixedRate(task5, 5, 5, SECONDS);
final ScheduledFuture<?> beeperHandle =
   scheduler.scheduleAtFixedRate(task10, 10, 10, SECONDS);

 scheduler.schedule(new Runnable() {
   public void run() { beeperHandle.cancel(true); }
 }, 60 * 60, SECONDS);

定時器通常由GUI框架提供,因為大多數GUI框架要求所有繪圖命令和GUI修改僅在主線程上發布。 具有類似要求的其他類似框架(即,僅在某些條件下要完成的某些任務)也將提供與框架施加的限制兼容的計時器實現。 使用您需要盡可能兼容的框架提供的計時器。

否則,如果你想自己實現它,至少有兩種常用的方法來實現定時器,一種是使用睡眠直到下一個事件的線程,另一種是在GUI框架中更常見的是使用事件循環。 另一種常見的方法是,對於間隔精度不是很重要的長時間運行的任務,使用cron(Unix和類Unix系統)或Scheduled Tasks(Windows)或Alarm Intents(Android)。

這樣做的正確方法是什么?

忽略別人對具體做法的看法,做時間的正確方法取決於你想做什么。 無論您需要短時間還是長時間間隔,是否需要非常精確的計時,或者如果您對稍晚和/或早期事件都很好,是否需要關心節省電池/ CPU,是否需要固定的啟動間隔或固定結束 - 啟動間隔,任務是否快速完成或者是否可能需要一些時間才能完成,是否要允許其他任務在前一個任務啟動之前啟動,是否需要持久性(即您是否希望能夠繼續執行系統重啟或進程終止后的計時器)。 所有這些都會影響最好的Timer使用。

如果您的應用程序非常大並且您還在使用負載平衡服務器,則可以嘗試使用Quartz調度程序進行時間管理活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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