Java 有限多线程操作

Java 有限多线程操作,java,multithreading,Java,Multithreading,我有一个过程(procA),它需要多次调用web服务,然后返回结果集 procA可以同时调用几次 对webservice的调用需要一定的时间,但是并发调用不会对性能产生很大影响 因此,为procA创建一个线程池来调用webservice是有益的,这样对procA的一次调用就可以完成对webservice的所有调用,然后等待它们全部完成后再继续 但是,我不希望每个procA有一个线程池,因为如果有多个并发调用procA,我希望限制/限制一次访问webservice的线程总数 最佳的解决方案是一个共

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

procA可以同时调用几次

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

因此,为procA创建一个线程池来调用webservice是有益的,这样对procA的一次调用就可以完成对webservice的所有调用,然后等待它们全部完成后再继续

但是,我不希望每个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    
    ...
守护进程线程[http-80-4](挂起) 不安全。驻车(布尔,长)行:不可用[本机方法] 锁支架。驻车(物体)线:158 FutureTask$Sync(AbstractQueuedSynchronizer).parkAndCheckInterrupt()行:747 FutureTask$Sync(AbstractQueuedSynchronizer).doAcquireSharedTerruptibly(int)行:905 FutureTask$Sync(AbstractQueuedSynchronizer).acquireSharedInterruptibly(int)行:1217 FutureTask$Sync.innerGet()行:218 FutureTask.get()行:83 ThreadPoolExecutor(AbstractExecutorService).invokeAll(集合)行:205 ...
最简单的方法是使用适当的
执行器服务
,然后使用该方法。作业异步运行,调用方法将阻塞,直到所有作业都完成


或者,您可以让procA的每个实例收集它提交给执行者的工作所附带的
未来
对象的集合。(如果合适的话,也可以在方法范围内执行。)然后迭代它们并阻塞它们的
get()
方法。循环完成后,工作就完成了。

最简单的方法是使用适当的
Executor Service
,然后使用该方法。作业异步运行,调用方法将阻塞,直到所有作业都完成


或者,您可以让procA的每个实例收集它提交给执行者的工作所附带的
未来
对象的集合。(如果合适的话,也可以在方法范围内执行。)然后迭代它们并阻塞它们的
get()
方法。当循环完成时,工作就完成了。

这是可行的,但是它似乎偶尔会在invokeAll上卡住,请参阅我的编辑以获取线程的堆栈跟踪。..icki,这不应该发生!在负载增加的情况下,httpclient库中可能有什么东西阻塞了?是否设置了web服务在可调用的内部响应的超时?您可以在invokeAll调用上设置一些高得离谱的超时(相对于正常任务时间),以使其能够继续运行,并查看它的位置/尝试恢复。我昨晚在10个线程池上再次尝试了50000次调用。很明显(正如您所建议的),在本例中,有2个线程挂起在webservice api上。我必须考虑解决这个问题,但就多线程而言,这个解决方案非常有效。谢谢。这是可行的,不过它似乎偶尔会被invokeAll卡住,请参阅我的编辑以获得线程的堆栈跟踪..icki,这不应该发生!在负载增加的情况下,httpclient库中可能有什么东西阻塞了?是否设置了web服务在可调用的内部响应的超时?您可以在invokeAll调用上设置一些高得离谱的超时(相对于正常任务时间),以使其能够继续运行,并查看它的位置/尝试恢复。我昨晚在10个线程池上再次尝试了50000次调用。很明显(正如您所建议的),在本例中,有2个线程挂起在webservice api上。我必须考虑解决这个问题,但就多线程而言,这个解决方案非常有效。谢谢