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时为什么会出现请求参数同化? 以及如何更好的兼顾效率和准确改进现有代码.
静等前辈指点,谢谢
没看懂你搞个计数器干嘛用的
######计数结束线程关闭######代码不贴全,搞得神神秘秘,谁知道哪出问题了
######......######CountDownLatch latch = new CountDownLatch(线程计数总数变量); 你为什么要加这个 这个会引起线程等待的
######我不知道是因为什么。如果你知道答案了告诉我一下,我也想知道。。。
######原因应该并发编程常见的问题!两个线程同时请求造成的。你也说了加了sleep(300)就正常了,sleep间接的给线程请求排序了,如果你的单次请求超过300,网络言辞什么的,依然会出现上面的问题。解决办法的哈,我记得是可以给线程排序的,让线程按顺序执行。。当然这样效率会低和你写sleep差不多,不过应该稍微快点,降低线程空闲时间。。菜鸟只能帮你到这,,你可以借鉴一下
######谢谢,我想想######刚刚看了一下,上面的方法可能不妥,而且你的方法应该不对,如果控制线程的数量应该使用线程池######httpclient组件库有异步请求的方式,其内部就是用的多线程,没必要自己造轮子,当然能造好也是挺好的######好的,我去看看那个组件,谢谢######单线程顺序执行就是了。。。
######infoQueryThread类贴出来才能看懂
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。