开发者社区> 问答> 正文

JAVA多线程post调用第三方接口请求值重复? 400 报错

JAVA多线程post调用第三方接口请求值重复? 400 报错

目前在做的业务需要POST方式调用第三方接口查询数据并处理保存起来.因为要查询的数据很多所以需要多线程提高效率.

代码使用 ExecutorService 作为线程池管理线程, CountDownLatch 控制线程数量 创建线程类继承Thread 重写的run方法中调用第三方接口查询数据并封装之后保存到缓存  memcache中

    private static final ExecutorService exe = Executors.newCachedThreadPool();

                CountDownLatch latch = new CountDownLatch(线程计数总数变量);
                for (info : List<Info>) {
                    //循环创建线程执行,查询条件info传入线程类
                    request; // 调用第三方接口的请求参数
                    Thread thread = new infoQueryThread(request, Infos,info, latch);
                    exe.execute(thread);
                    thread.sleep(300);
                }

 

目前遇到的问题时线程正常运行,参数也传入正常,当断点运行时没有错误,但是放开运行会出现请求参数变为同一个,就是说所有线程的请求和返回结果都相同.不得己在后面加了 thread.sleep(300); 才使程序正常使用,但是效率很低.

请问不加 sleep时为什么会出现请求参数同化? 以及如何更好的兼顾效率和准确改进现有代码. 

静等前辈指点,谢谢

展开
收起
爱吃鱼的程序员 2020-06-03 15:07:00 1886 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    没看懂你搞个计数器干嘛用的

    ######计数结束线程关闭######

    代码不贴全,搞得神神秘秘,谁知道哪出问题了

    ######......######

     CountDownLatch latch = new CountDownLatch(线程计数总数变量);  你为什么要加这个 这个会引起线程等待的  

    ######

    我不知道是因为什么。如果你知道答案了告诉我一下,我也想知道。。。

    ######

    原因应该并发编程常见的问题!两个线程同时请求造成的。你也说了加了sleep(300)就正常了,sleep间接的给线程请求排序了,如果你的单次请求超过300,网络言辞什么的,依然会出现上面的问题。解决办法的哈,我记得是可以给线程排序的,让线程按顺序执行。。当然这样效率会低和你写sleep差不多,不过应该稍微快点,降低线程空闲时间。。菜鸟只能帮你到这,,你可以借鉴一下

    ######谢谢,我想想######刚刚看了一下,上面的方法可能不妥,而且你的方法应该不对,如果控制线程的数量应该使用线程池######httpclient组件库有异步请求的方式,其内部就是用的多线程,没必要自己造轮子,当然能造好也是挺好的######好的,我去看看那个组件,谢谢######

    单线程顺序执行就是了。。。

    ######

    infoQueryThread类贴出来才能看懂

    2020-06-03 16:38:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载