有限的多线程操作

时间:2010-07-29 05:29:12

标签: java multithreading

我有一个程序(procA)需要多次调用webservice然后返回结果集。

可以同时将procA称为少数几次。

对Web服务的调用需要一定的时间,但并发调用不会对性能产生很大影响。

因此,为procA创建一个线程池来调用webservice是有益的,这样对procA的单个调用可以将所有调用的队列排到Web服务,然后等到它们全部完成后再继续。

但是我不希望每个procA都有一个线程池,因为如果有多个并发调用procA,我想限制/限制一次访问webservice的线程总数。

最佳解决方案是共享线程池,每个调用procA共享。

我需要帮助解决的唯一问题是如何判断第一次调用procA排队的所有Web服务任务都已完成?

编辑:堆栈跟踪

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    
    ...

1 个答案:

答案 0 :(得分:4)

最简单的方法是使用正确的ExecutorService并使用invokeAll方法。您的作业以异步方式运行,并且调用方法将阻塞,直到所有作业完成。

或者,您可以让每个procA实例收集与它提交给执行者的工作一起的Future个对象的集合。 (或者在适当的情况下在方法范围内进行。)然后迭代它们并阻止它们的get()方法。循环完成后,工作就完成了。

相关问题