1

我的下一個項目:的Java ScheduledExecutorService的生產者消費

春季(3.2)爲基礎的Web應用程序(Tomcat的7),在後臺我有幾個任務。

我有一個處理一些信息的隊列。該隊列正在定期更新(但只是在空時)。

另外我有幾個線程週期性排隊來自這個隊列和進程的數據。

對於計劃我想使用ScheduledExecutorService。

我有幾個問題\問題:

  1. 如何保持這個隊列?我認爲它應該是全球性的。我應該在某些「持有者」類中將其設爲靜態嗎?這不是一個可憐的設計嗎?

  2. 哪裏將是使用ScheduledExecutorService初始化此隊列和所有任務的好地方? ServletContextLoadingListener是一個很好的地方嗎?有什麼方法可以用Spring來初始化?

  3. 如果我需要嚴格控制使用者線程的數量,我應該使用幾個ScheduledExecutorService實例嗎?

  4. ArrayBlockingQueue是否適合這種情況?

回答

1
  1. 您可以使用一個普通的類,讓春天的範圍singleton管理。
  2. 您可以在彈簧配置中使用init-method配置Bean,或者在您的類中實現InitializingBean接口。
  3. ScheduledExecutorService的線程編號可通過構造函數參數進行配置。如果您有幾種類型的任務並希望在單獨的線程池中運行它們,則可以使用多個ScheduledExecutorService實例。但是,如果您的所有任務都屬於同一類型,我不認爲需要多個ScheduledExecutorService實例。
  4. JDK提供的ScheduledThreadPoolExecutor有一個java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue.DelayedWorkQueue類的內部工作隊列(並且它是不可配置的)。我不確定你把ArrayBlockingQueue放在哪裏。
+0

感謝,關於第4項,我需要一個可更新的隊列,其中包含一些用於處理工作線程的數據,據我所知,DelayedWorkQueue在ScheduledExecutorService內部,並且適用於我在那裏提交的工作線程。 – 2013-02-25 07:45:13