雪月飞花 2021-10-26 18:04 采纳率: 0%
浏览 15

有关CountDownLatch的问题,代码如下所示。

public class CountDownTest {

public static Map<String, String> b(Map<String, String> map) {
    ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(12));
    HashMap<String, String> hashMap = new HashMap<>();
    int size = map.size();
    try {
        CountDownLatch countDownLatch = new CountDownLatch(size);
        map.forEach((k, v) -> {
            executor.submit(

                    () -> {
                        String a = v + "2";
                        hashMap.put(k, a);
                        countDownLatch.countDown();
                    }
            );
        });
        countDownLatch.await();
        return hashMap;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        executor.shutdown();
        return hashMap;
    }
}
public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("1", "a");
    map.put("2", "b");
    map.put("3", "c");
    Map<String, String> a = b(map);
    for (String l : a.keySet()) {
        System.out.println(a.get(l));
    }
}

}
大多数情况下输出: a2,b2,c2 但有时也会输出 a2,b2,或b2,c2,或a2,c2 这种情况,问题出在哪?

  • 写回答

1条回答 默认 最新

  • 尘风-随手记 2021-10-26 19:05
    关注

    img


    首先CountDownLatch只是控制并发数量,并不保证并发顺序。图片里框出的地方里启动了多个线程去打印,但是你没有控制打印顺序的代码

    评论

报告相同问题?

问题事件

  • 创建了问题 10月26日

悬赏问题

  • ¥60 渗透一个指定银行app,拿到客户信息,需要什么级别
  • ¥15 SSH项目查询始终报错
  • ¥15 请问登录成功后如何获得刚刚登录的用户信息SSH项目
  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问