我有一个过程(procA),该过程需要多次调用Web服务,然后返回结果集。

可以同时调用procA几次。

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

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

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

最佳解决方案是共享线程池,每个对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
    ...

最佳答案

最简单的方法是使用适当的ExecutorService,而仅使用invokeAll方法。您的作业异步运行,并且调用方法将阻塞,直到全部完成。

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

关于java - 有限的多线程操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3359693/

10-10 01:06