2013-01-18 29 views
1

我正在設計一個服務器,我需要能夠安排數以千計的任務。該任務每5秒執行一次。 scheduledexecutorservice能夠以高準確度處理數千個任務嗎?我試圖在一個線程中完成時間安排。但實際任務將在線程池中執行。謝謝Java計劃執行器服務功能

我不確定它是如何工作的,所以如果有人可以澄清,以及它將不勝感激!

回答

0

我建議你閱讀scheduler executor服務的javadocs。有沒有特別的觀點讓你懷疑它是工業實力?您應該使用它並衡量您的性能,以檢查它是否與您的用例相匹配。

而且,除非你有你不應該與庫類的實現鼓搗強有力的理由(隔離客戶端上的調度和任務執行線程)

但是,你應該評估使用庫的石英如果您調度準則預計會變得複雜 - 超出了調度程序執行器服務提供的基本用例。

+0

你應該在你寫答案時嘗試回答這個問題,但是要感謝 – Tukhes

3

ScheduledExecutorService由一個線程池支持。粗略地說,你可以計算同時運行任務所需的線程數,而不使用下列公式延遲:

在池中的線​​程的最小數目等於平均每秒次平均任務運行時

執行的任務

例如,平均起來2個任務需要3秒(平均)完成,您需要6個線程。當然,這假定任務的分配隨着時間的推移相當均勻。

您也可以使用Executors.newCachedThreadPool(),它理論上可以同時運行無數個任務。顯然可用的內存和上下文切換的數量將大大減少這個數字。

如果您的使用場景是:運行數千個任務,每五秒在同一時間點執行一次 - 無論是JVM還是任何其他平臺都無法處理。即使你有成千上萬的線程,你也受到CPU核心數量的限制。準確性高度依賴於你的任務的性質(CPU密集型?阻塞I/O?)

+0

這些任務是否在他們的計時期間創建了一個線程?就像如果我在5秒鐘內運行一個任務,它會打開一個新線程/立即使用一個nee線程,或者直到5秒後才啓動? – Tukhes

+0

@Tukhes:它取決於你使用哪個線程池。有些池創建*固定數量的線程,如果全部使用,則任務等待。其他* cache *已經創建了線程,因此如果必須執行新任務,則它使用緩存的一個,或者如果使用全部線程,則會創建新線程。一些線程池也會在一段時間後關閉空閒線程。 –

+0

好吧,但讓我說5秒內執行任務。什麼時候創建線程?現在還是5秒? @Tomasz Nurkiewicz – Tukhes