2010-05-27 88 views
4

我已經堆積數週試圖找到一個解決方案。我一遍又一遍地回到相同的地方。 Java的ScheduledThreadPoolExecutor 的替代品...但沒有任何做到這一點。我需要一個java調度程序與其他調度程序共享一個線程池

我要的是執行syncrhonized /串行調度內部人員,有很多做調度的那independentely彼此,由一個單一的線程池的支持...

我在Java和什麼樣的服務器應用程序我需要的是創建數百和數千個調度程序。

我想每個調度執行其串行和syncrhonized工作。

所有的調度程序可以同時獨立運行,但我還需要通過使用線程池(不是每個調度程序的線程池,而是所有調度程序的一個線程池!)來限制所有調度程序的線程數。 此外,暫停/恢復作業並將它們放入組中的功能會很好。 任何解決方案?提前致謝!

+1

爲什麼你需要這麼多的調度程序?事實上,你爲什麼要多過一個?許多*工作*是,但許多調度員?爲什麼? – skaffman 2011-02-12 17:20:38

回答

0

如果您希望作業在ScheduledThreadPoolExecutor內連續執行,您只需創建一個聚合作業,以串行方式執行每個實際作業並將其提交給ScheduledThreadPoolExecutor。雖然如果你需要數千個調度程序同時運行,但仍然限制不了。的線程,你可能會遇到麻煩 - 至少如果這些工作需要很長的時間才能執行,所以你開始滑動你的計劃。

我說你應該看看Quartz處理這一點,因爲它會處理大部分的調度和作業的血淋淋的細節。

+0

你好! 感謝您的回答。 我對使用ScheduledThreadPoolExecutor和聚合作業的解決方案很感興趣。這是我有時在想的事情,但我對實施有一些嚴肅的問題。 1.如何創建包含延遲實際工作的聚合作業? 2.這個聚合作業如何執行它們中的每一個......每次在實際作業列表中循環查看哪一個需要執行? 3.這是不是有效?它應該如何提交(聚合作業)到ScheduledThreadPoolExecutor?使用延遲?或不? 謝謝! )) – alexei 2010-05-27 12:34:04

+0

1.通過彙總工作,我想到了一系列連續運行的作業,一個接一個地運行。這聽起來像你有一系列延遲不同的工作 - 你是否真的需要這些「連續」執行? 2.不要那樣做。 3.如果您希望在某個延遲後執行作業,請使用延遲,否則請勿延遲。 – nos 2010-05-27 12:54:30

+0

首先請原諒我的英語。 1.通過說串行執行我的意思是任務之間的同步執行。我不希望我的實際工作同時執行。 2.問題是如何去做。如果不通過循環任務列表,那麼該怎麼做? 3.關於這一個確定;) – alexei 2010-05-27 13:07:18

0

我試圖自己找到這樣的解決方案。在.Net世界中,你有一個由系統提供的中心共享線程池,它動態擴展和縮小。我的情況是,我有很多低頻維護類型的工作,一個線程應該能夠處理它們。

我想你可以有一個單獨的Executor(線程池版本)的地方,並經常用它來安排任務。這將模仿.Net行爲。

1

你有沒有使用HawtDispatch和大量的串行隊列的考慮? 它聽起來像它可能會做的,只需一個簡單的API。我一直在考慮自己嘗試。據我瞭解,Akka項目使用它。

+0

其實,我的意思是說「阿卡」。 – 2010-08-28 13:21:54

+1

你可以使用'edit'鏈接編輯你的答案。 – BalusC 2010-08-28 13:36:03

0

也許一個獨立的調度,如Quartz Scheduler將服務器您的需求?

+0

石英的開銷比大多數線程池/調度程序高得多,所以我不認爲這是在正確的球場。 – 2011-02-12 17:15:28

2

你需要www.dhtmlx.com/x/download/regular/dhtmlxConnector_v09_java.zip什麼是許多調度程序和一個執行程序。調度程序不應該自己執行任務,而是將它們提交給執行程序。調度程序可以實現爲java.util.Timer任務。

+0

其他細節將會有用。或者至少是一個到java.util.Timer的鏈接 – 2012-12-07 04:57:37

1

您可以使用HawtDispatch線程庫。它提供了一個libdispatch風格的API。 對於您的用例,您需要爲每組需要串行執行的任務創建一個串行隊列。然後安排要在其上執行的任務。例如:

DispachQueue q1 = createQueue(); 
DispachQueue q2 = createQueue(); 
... 
DispachQueue qN = createQueue(); 

Runnable task = ... 
qN.execute(task) 
// or to execute in the future 
qN.dispatchAfter(1, TimeUnit.SECOND, task) 

所有隊列都使用共享線程池。