weixin_42453340
2011-05-11 15:19 阅读 266
已采纳

请教个Java多线程的问题

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

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

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

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    etank2011 etank2011 2011-05-11 15:51

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

    点赞 评论 复制链接分享
  • redstarofsleep redstarofsleep 2011-05-11 15:22

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

    点赞 评论 复制链接分享
  • fmjsjx fmjsjx 2011-05-11 15:43

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

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

    点赞 评论 复制链接分享

相关推荐