有个需求是这样的, 我本地的工程需要调用外部的一个webservice
但是外部的每次只能接受10个查询.
那我现在加入有100个需要查询, 我打算用多线程做, 比如这里我就跑10个线程去发送请求,
我想问的是, 我怎么管理这10个请求呢? 因为我需要等结果全部返回了, 组织好结构了再继续往下走
请大家提供点思路, 谢谢了
有个需求是这样的, 我本地的工程需要调用外部的一个webservice
但是外部的每次只能接受10个查询.
那我现在加入有100个需要查询, 我打算用多线程做, 比如这里我就跑10个线程去发送请求,
我想问的是, 我怎么管理这10个请求呢? 因为我需要等结果全部返回了, 组织好结构了再继续往下走
请大家提供点思路, 谢谢了
任务开始前将所有的请求放入一个队列中
开启一个CountdownLatch(具体使用请自查),如果是100个任务就指定为100,然后没完成一个请求就countdown一次
等待线程通过使用await方法等待所有请求都完成就会继续执行
请求的执行采用一个连接池,池的大小就是10个,都从请求队列中获取请求然后处理,没处理完一次就countdown一下
简单代码模拟如下:
[code="java"]
//Request (请求的任务)
//Queue (请求队列)
//主线程如下:
//add all requests into queue
CountdownLatch latch = new CountdownLatch(100);
//启动处理线程
latch.await(); //这里最好判断返回值,并设定超时,还有可能抛出异常,具体查看jdk文档实例
//处理后续的操作,正常到达这里时表示所有任务已经完成
//下面是处理线程,最好启动多个,不然连接池就没有价值了
Request request = null;
while ((request = queue.poll()) != null) {
//获得连接并执行请求,如果没有更多请求则返回
Connection conn = connPool.getConnection();
conn.execute(request);
//这里要减少latch的值
latch.countdown();
}
[/code]
基本的思路是:
使用CountdownLatch作为多线程任务的同步锁,只有当所有任务都完成时latch才会正常返回
执行任务时则可以使用ExecutorService并发处理,连接通过连接池保证不超过上限