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

请教个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条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料