请教个Java多线程的问题

有个需求是这样的, 我本地的工程需要调用外部的一个webservice

但是外部的每次只能接受10个查询.

那我现在加入有100个需要查询, 我打算用多线程做, 比如这里我就跑10个线程去发送请求,

我想问的是, 我怎么管理这10个请求呢? 因为我需要等结果全部返回了, 组织好结构了再继续往下走

请大家提供点思路, 谢谢了

3个回答

任务开始前将所有的请求放入一个队列中
开启一个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并发处理,连接通过连接池保证不超过上限

把这10个请求放到Map里面管理。
做完了就标示为可用,再有请求来了就从Map里面取可用的。

两个思路:
1.启动一个monitor线程,不断轮询结果集,看看100个结果是否都已返回。有就跳出循环,执行后续操作;没有就继续循环(可暂停线程一小段时间)。
2.在每个线程结果返回时去检查一下结果集,看看100个结果是否都已返回。有就执行后续操作;没有就算了,神马都不做。

其中,结果集可以是Collection、Map、数组等等,但要注意线程安全问题,用同步锁或读写锁皆可。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐