weixin_42453340
2011-05-11 15:19
浏览 268
已采纳

请教个Java多线程的问题

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

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

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

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

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

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

3条回答 默认 最新

  • 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并发处理,连接通过连接池保证不超过上限

    评论
    解决 无用
    打赏 举报
查看更多回答(2条)

相关推荐 更多相似问题