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

konooo 发布于 2017/07/13 10:04
阅读 1K+
收藏 0

目前在做的业务需要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时为什么会出现请求参数同化? 以及如何更好的兼顾效率和准确改进现有代码. 

静等前辈指点,谢谢

加载中
0
就是个精虫上脑的地方
就是个精虫上脑的地方

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

konooo
konooo
计数结束线程关闭
0
士别三日
士别三日

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

konooo
konooo
......
0
三十回头
三十回头

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

0
gaomq
gaomq

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

0
微笑兔
微笑兔

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

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

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

0
bigPig_ink
bigPig_ink

infoQueryThread类贴出来才能看懂

返回顶部
顶部