zoukankan      html  css  js  c++  java
  • 用CountDownLatch来同步java的多线程

    最近写了一个并发幂等测试,用线程池加入多个线程,同时启动,领导觉得这样有一定的风险,要求更严格一点,把所有的线程加入池中,然后同时启动。

    本来有多种方法,因为我们需要从多个线程中获取返回值,所以我们用CountDownLatch来同步多线程。CyclicBarrier也是可以同步多线程的,但因为其无法获取返回值,最后只能选择CountDownLatch.

    因公司的代码不便共享,这里只提供一小部分代码。

    CountDownLatch latch = new CountDownLatch(1);

    ExecutorService pool; if (concurrentNum != null&&concurrentNum <= maxConcurrentNum && concurrentNum > 0) { pool = Executors.newFixedThreadPool(concurrentNum); } else { concurrentNum = defaultConcurrentNum; pool = Executors.newFixedThreadPool(defaultConcurrentNum); } for (int i = 0; i < concurrentNum; i++) { Future res = pool.submit(new Callable<Object>() { @Override public Object call() throws Exception { latch.await(); Object retObj = executeApi(); return retObj; } }); resultList.add(res); } latch.countDown(); for (int i = 0; i < concurrentNum; i++) { retList.add(resultList.get(i).get()); } pool.shutdown();

      这里顺便提一下,latch在中文中就是门栓的意思,这样就很好理解了,当有门栓时,latch.await()的线程都在等待,只有当门栓的个数为0时那些线程才能同时释放出来,所以能同步运行多线程。

  • 相关阅读:
    friend ---- public and private
    c++中const使用详解
    In c++ access control works on per-class basis not on per-object basis.
    realloc 用法
    enum don't allocate any memory
    (转)C++ STL中的vector的内存分配与释放
    计算机网络面试总结
    Redis安装与测试
    Hbase的安装与测试
    使用ActiveMQ实现简易聊天功能
  • 原文地址:https://www.cnblogs.com/linwenbin/p/12700983.html
Copyright © 2011-2022 走看看