windghost817 2018-11-09 16:11 采纳率: 71.4%
浏览 518
已采纳

请问这样使用线程池的问题在哪?

接手的项目里有这样一段代码,大概就是数据库返回的list使用多线程补充些数据,但是实际运行起来的时候 briefVo补充的数据有概率会发生混乱-->briefVo指向了list中的其他项。求助,这段代码究竟是哪里有问题?

// int countThread =list.size();
// ExecutorService threadPool = Executors.newFixedThreadPool(countThread);
// //计数器
// final CountDownLatch countDownLatch = new CountDownLatch(countThread-1);
// Future[] futures = new Future[countThread];
// for(int x=0; x<=(countThread-1); x++) {
// Inv sub = list.get(x);
// futures[x] = threadPool.submit(() -> {
// try {
// handleData(sub);
// }catch(Exception e) {
// e.printStackTrace();
// LOG.error(e,e);
// throw e;
// }finally {
// //计数器-1
// countDownLatch.countDown();
// }
// return null;
// });
// }
// try {
// countDownLatch.await();
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// }finally {
// threadPool.shutdown();
// }

public void handleData( Inv sub){
BriefVo briefVo = bonService.getBriefById(sub.getId());
sub.setBriefVo(issuerBriefVo);
}

  • 写回答

2条回答 默认 最新

  • x060508 2018-11-11 07:01
    关注

    // final CountDownLatch countDownLatch = new CountDownLatch(countThread-1);
    不用减1

    线程数为4

    new CountDownLatch(3);

    for循环四次 但其实到第三次的时候count已经减到0了 就直接方形await方法 但是其实还有个线程有可能没执行完

    建议 了解下 CompletionService 或者 CompletableFuture

    第四个线程有可能优先抢到cup运行出结果 也可能抢不到 然后mai方法就结束了
    所以demo有时候重现得出来 有时候出不来

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题