2012-11-19 33 views
3

我需要在Java代碼中進行一些定期檢查。有些東西得到單獨的線程中執行,並有我需要檢查每一個事物5秒鐘,然後一些其他的事情,每10分鐘等在Java中實現「定時器」的正確方法?

我應該如何在Java中實現這些「計時器」?我應該循環,然後發送線程睡一段時間?

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

+0

請參閱[this](http:// stackoverflow。COM /問題/ 6205210 /是此結果如何到時間表-A-java的方法可以運行-1-第二以後/ 6205260#6205260)。在評論部分,我提供了使用執行者框架與定時器的理由的鏈接。 – mre

回答

5

您應該使用ScheduledThreadPoolExecutor class,它確實如此。

+1

或者如果你不需要任何東西,可以使用工廠方法'Executors.newScheduledThreadPool(nThreads)'。 –

4

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

javadoc

它可另行安排指揮一個給定的延遲後運行 ,或定期執行的ThreadPoolExecutor。這個類是 優選定時器時,需要多個工作線程,或 的ThreadPoolExecutor (其中此類擴展)的額外的靈活性或能力當需要

2

有許多的方法可以做到這一點,我將使用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); 
1

定時器由GUI框架,因爲大多數GUI框架要求所有的繪圖命令和GUI的修改只能在主線程發出的一般規定。具有相似要求的其他類似框架(即僅在特定條件下才能完成的某些任務)也將提供與該框架施加的限制兼容的計時器實施。使用你需要的框架提供的定時器,只要有可能就可以兼容。如果你想自己實現它,至少有兩種常用的方法來實現定時器,一種是使用睡眠直到下一個事件的線程,另一種在GUI框架中更常見,是使用事件循環。另一種常見的方式是,對於間隔精度不太重要的非常長時間的運行任務,使用cron(Unix和類Unix系統)或計劃任務(Windows)或鬧鐘意圖(Android)。

會是什麼做的正確方法?

忽略其他人對特定方式所說的做法,正確的做法取決於你想要做什麼。無論您需要短時還是長時間間隔,您是否需要非常精確的時間,或者如果您在稍晚和/或早期事件中都處於良好狀態,您是否需要關心節省電池/ CPU,無論您是需要固定的啓動時間間隔還是固定的終端時間間隔,啓動時間間隔,任務是否快速完成或是否需要一段時間才能完成,是否允許另一個任務在前一個任務啓動之前啓動,是否需要持久性(即是否希望能夠繼續定時器在系統重新啓動或進程終止後)。所有這些都會影響最佳的Timer使用。

1

如果你的應用是相當大的,你還使用負載平衡服務器,你可以嘗試石英調度時間管理活動。