2010-07-29 60 views
1

我有一個過程(procA)需要多次調用Web服務,然後返回結果集。有限的多線程操作

procA可能會同時被稱爲少數幾次。

對web服務的調用需要一段時間,但併發調用不會對性能產生很大影響。

因此,爲procA創建一個線程池來調用web服務將是有益的,這樣一次調用procA就可以調用所有對web服務的調用,然後等待它們全部完成後再繼續。

但是我不想每個procA都有一個線程池,因爲如果有多個對procA的併發調用,我想限制/限制一次訪問webservice的線程總數。

最佳解決方案是一個共享線程池,每個線程池都調用procA共享。

我需要幫助解決的唯一問題是如何告訴所有通過第一次調用procA排隊的webservice任務完成?

編輯:堆棧跟蹤

Daemon Thread [http-80-4] (Suspended) 
    Unsafe.park(boolean, long) line: not available [native method] 
    LockSupport.park(Object) line: 158 
    FutureTask$Sync(AbstractQueuedSynchronizer).parkAndCheckInterrupt() line: 747 
    FutureTask$Sync(AbstractQueuedSynchronizer).doAcquireSharedInterruptibly(int) line: 905 
    FutureTask$Sync(AbstractQueuedSynchronizer).acquireSharedInterruptibly(int) line: 1217 
    FutureTask$Sync.innerGet() line: 218  
    FutureTask<V>.get() line: 83  
    ThreadPoolExecutor(AbstractExecutorService).invokeAll(Collection<Callable<T>>) line: 205  
    ... 

回答

4

最簡單的就是用正確的ExecutorService,只是使用的方法invokeAll。你的作業是異步運行的,並且調用方法會阻塞,直到全部完成。

或者,您可以讓procA的每個實例收集與提交給執行程序的工作對應的Future對象的集合。 (或者如果適當的話,在方法範圍內進行。)然後遍歷它們並阻止它們的方法get()。循環完成後,工作完成。

+0

不錯,我會試試看! – pstanton 2010-07-29 05:42:07

+0

重新編輯,事件更好!一旦我測試過,就會給我打勾。 – pstanton 2010-07-29 05:51:36

+0

這個工作,但它似乎卡住invokeAll偶爾,看到我的編輯線程的堆棧跟蹤.. – pstanton 2010-07-29 06:44:49