2008-11-27 60 views
1

我有一個webservice,在返回結果之前進行多個小計算。我想使用Executors.newFixedThreadPool()提供的ExecutorService作爲實現主 - 工作模式(即調用invokeAll並讓線程等待所有結果完成)的一種方式。理想情況下,所有Web服務線程都使用相同的執行程序服務,以便它們不必都創建自己的線程池,並且可以共享一個佔用系統所有處理時間的大型池。一個java fixedThreadPool可以被多個線程使用

問題我有這種做法:

  • 是安全地從多個線程訪問invokeAll功能。
  • 將執行服務只是處理請求順序(即首先從線程1的任務,那麼這些線程
  • 是有辦法有說10個工作線程,並具有最大的可用線程取決於在正在添加請求的數量,所以說我們有1個請求,它使用所有10個線程,該請求。如果你有2個請求,它分裂他們每個請求的5個線程等

回答

1

我要說不使用invokeAll。讓每個請求調用ExecutorService.submit,以執行並行執行的每個子任務。線程池將處理任務的調度(這就是它的設計目的!)

是的,如果你使用Executors.newFixedThreadPool(),每個請求都被放置在一個隊列中,所以它們被按順序處理。

0

我認爲你應該使用Semaphore而不是的invokeAll()

2

當在Java EE服務器運行時,你不應該自己創建的線程。我意識到這不是一個好的情況,所以你應該根據你使用的應用服務器來調查替代方案。如果是WebSphere或Weblogic,則應使用commonj規範的WorkManager,它提供了所需的確切功能。還有一個JBoss的實現。

您應該看看在託管環境中創建自己的線程作爲最後的手段。

相關問題