Java 有限多线程操作
我有一个过程(procA),它需要多次调用web服务,然后返回结果集 procA可以同时调用几次 对webservice的调用需要一定的时间,但是并发调用不会对性能产生很大影响 因此,为procA创建一个线程池来调用webservice是有益的,这样对procA的一次调用就可以完成对webservice的所有调用,然后等待它们全部完成后再继续 但是,我不希望每个procA有一个线程池,因为如果有多个并发调用procA,我希望限制/限制一次访问webservice的线程总数 最佳的解决方案是一个共享线程池,每个对procA的调用都共享该线程池 我需要帮助解决的唯一问题是,如何判断第一次调用procA排队的所有webservice任务都已完成 编辑:堆栈跟踪Java 有限多线程操作,java,multithreading,Java,Multithreading,我有一个过程(procA),它需要多次调用web服务,然后返回结果集 procA可以同时调用几次 对webservice的调用需要一定的时间,但是并发调用不会对性能产生很大影响 因此,为procA创建一个线程池来调用webservice是有益的,这样对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上。我必须考虑解决这个问题,但就多线程而言,这个解决方案非常有效。谢谢