j.u.c—CountDownLatch
阿新 • • 發佈:2018-12-12
CountDownLatch類介紹
CountDownLatch是一個同步輔助類,通過它可以完成類似於阻塞當前執行緒功能,換句話說,一個執行緒或多個執行緒一直等待,直到其它執行緒執行的操作完成。CountDownLatch用了一個給定的計數器來進行初始化,該計數器的操作是原子操作,就是同時只能有一個執行緒去操作該計數器。呼叫該類的await()方法的執行緒會一直處於阻塞狀態,直到其它執行緒呼叫countDown()這個方法,使當前計數器的值變為0。每次呼叫countDown()方法時,計數器的值會減1,當計數器的值減到0的時候,所有因呼叫await()方法而處於等待狀態的執行緒就會繼續往下執行,這種操作只會出現一次,因為這個計數器的值是不能被重置的。
使用場景分析
在某些業務場景中,程式執行需要等待某個條件完成後才能繼續執行後續的操作。典型的應用,比如說平行計算,當某個處理的運算量很大時,可以將該運算任務拆分成多個子任務,等待所有的子任務都完成之後,父任務再拿到所有子任務的運算結果進行彙總。
CountDownLatch使用舉例:
package com.yuxing.springbootdemo.juc; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import lombok.extern.slf4j.Slf4j; @Slf4j public class CountDownLatchExample { private static int threadCount = 200; public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); final CountDownLatch countDownLatch = new CountDownLatch(threadCount); for(int i = 0;i < threadCount;i++){ final int threadNum = i; exec.execute(() -> { try { test(threadNum); } catch (InterruptedException e) { log.error("exception", e); }finally { countDownLatch.countDown(); } }); } countDownLatch.await(); log.info("finish"); exec.shutdown(); } private static void test(int threadNum) throws InterruptedException { Thread.sleep(100); log.info("{}", threadNum); Thread.sleep(100); } }
執行結果:
20:09:37.464 [pool-1-thread-159] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 158 20:09:37.480 [pool-1-thread-74] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 73 20:09:37.480 [pool-1-thread-37] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 36 20:09:37.480 [pool-1-thread-20] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 19 20:09:37.480 [pool-1-thread-12] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 11 20:09:37.480 [pool-1-thread-40] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 39 20:09:37.480 [pool-1-thread-33] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 32 20:09:37.479 [pool-1-thread-31] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 30 20:09:37.480 [pool-1-thread-21] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 20 20:09:37.480 [pool-1-thread-8] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 7 20:09:37.480 [pool-1-thread-38] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 37 20:09:37.480 [pool-1-thread-32] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 31 20:09:37.480 [pool-1-thread-34] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 33 20:09:37.480 [pool-1-thread-22] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 21 20:09:37.480 [pool-1-thread-35] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 34 20:09:37.479 [pool-1-thread-28] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 27 20:09:37.480 [pool-1-thread-9] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 8 20:09:37.480 [pool-1-thread-39] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 38 20:09:37.480 [pool-1-thread-30] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 29 20:09:37.479 [pool-1-thread-3] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 2 20:09:37.480 [pool-1-thread-36] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 35 20:09:37.480 [pool-1-thread-7] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 6 20:09:37.479 [pool-1-thread-19] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 18 20:09:37.479 [pool-1-thread-29] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 28 20:09:37.479 [pool-1-thread-18] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 17 20:09:37.479 [pool-1-thread-25] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 24 20:09:37.479 [pool-1-thread-27] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 26 20:09:37.479 [pool-1-thread-23] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 22 20:09:37.479 [pool-1-thread-17] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 16 20:09:37.479 [pool-1-thread-16] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 15 20:09:37.479 [pool-1-thread-24] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 23 20:09:37.479 [pool-1-thread-5] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 4 20:09:37.479 [pool-1-thread-14] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 13 20:09:37.479 [pool-1-thread-2] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 1 20:09:37.479 [pool-1-thread-15] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 14 20:09:37.479 [pool-1-thread-10] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 9 20:09:37.479 [pool-1-thread-4] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 3 20:09:37.479 [pool-1-thread-11] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 10 20:09:37.479 [pool-1-thread-6] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 5 20:09:37.479 [pool-1-thread-1] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 0 20:09:37.479 [pool-1-thread-13] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 12 20:09:37.479 [pool-1-thread-93] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 92 20:09:37.479 [pool-1-thread-94] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 93 20:09:37.479 [pool-1-thread-96] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 95 20:09:37.479 [pool-1-thread-95] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 94 20:09:37.479 [pool-1-thread-110] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 109 20:09:37.479 [pool-1-thread-97] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 96 20:09:37.479 [pool-1-thread-108] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 107 20:09:37.479 [pool-1-thread-57] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 56 20:09:37.479 [pool-1-thread-99] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 98 20:09:37.479 [pool-1-thread-54] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 53 20:09:37.479 [pool-1-thread-98] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 97 20:09:37.475 [pool-1-thread-100] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 99 20:09:37.475 [pool-1-thread-102] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 101 20:09:37.475 [pool-1-thread-103] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 102 20:09:37.475 [pool-1-thread-101] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 100 20:09:37.475 [pool-1-thread-104] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 103 20:09:37.475 [pool-1-thread-109] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 108 20:09:37.475 [pool-1-thread-105] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 104 20:09:37.475 [pool-1-thread-106] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 105 20:09:37.475 [pool-1-thread-107] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 106 20:09:37.464 [pool-1-thread-164] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 163 20:09:37.475 [pool-1-thread-77] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 76 20:09:37.475 [pool-1-thread-76] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 75 20:09:37.467 [pool-1-thread-157] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 156 20:09:37.475 [pool-1-thread-78] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 77 20:09:37.467 [pool-1-thread-126] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 125 20:09:37.467 [pool-1-thread-124] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 123 20:09:37.475 [pool-1-thread-79] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 78 20:09:37.467 [pool-1-thread-182] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 181 20:09:37.475 [pool-1-thread-80] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 79 20:09:37.467 [pool-1-thread-125] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 124 20:09:37.475 [pool-1-thread-81] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 80 20:09:37.475 [pool-1-thread-82] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 81 20:09:37.464 [pool-1-thread-179] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 178 20:09:37.467 [pool-1-thread-119] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 118 20:09:37.475 [pool-1-thread-84] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 83 20:09:37.475 [pool-1-thread-83] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 82 20:09:37.464 [pool-1-thread-120] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 119 20:09:37.475 [pool-1-thread-87] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 86 20:09:37.467 [pool-1-thread-181] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 180 20:09:37.475 [pool-1-thread-86] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 85 20:09:37.467 [pool-1-thread-122] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 121 20:09:37.475 [pool-1-thread-85] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 84 20:09:37.475 [pool-1-thread-88] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 87 20:09:37.468 [pool-1-thread-117] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 116 20:09:37.468 [pool-1-thread-184] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 183 20:09:37.475 [pool-1-thread-89] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 88 20:09:37.475 [pool-1-thread-91] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 90 20:09:37.464 [pool-1-thread-144] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 143 20:09:37.468 [pool-1-thread-121] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 120 20:09:37.475 [pool-1-thread-92] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 91 20:09:37.468 [pool-1-thread-123] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 122 20:09:37.468 [pool-1-thread-118] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 117 20:09:37.475 [pool-1-thread-90] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 89 20:09:37.470 [pool-1-thread-138] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 137 20:09:37.475 [pool-1-thread-59] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 58 20:09:37.468 [pool-1-thread-132] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 131 20:09:37.468 [pool-1-thread-183] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 182 20:09:37.475 [pool-1-thread-60] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 59 20:09:37.464 [pool-1-thread-180] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 179 20:09:37.474 [pool-1-thread-137] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 136 20:09:37.475 [pool-1-thread-61] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 60 20:09:37.468 [pool-1-thread-115] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 114 20:09:37.475 [pool-1-thread-62] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 61 20:09:37.470 [pool-1-thread-146] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 145 20:09:37.468 [pool-1-thread-193] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 192 20:09:37.468 [pool-1-thread-197] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 196 20:09:37.468 [pool-1-thread-56] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 55 20:09:37.475 [pool-1-thread-63] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 62 20:09:37.464 [pool-1-thread-171] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 170 20:09:37.468 [pool-1-thread-153] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 152 20:09:37.475 [pool-1-thread-64] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 63 20:09:37.475 [pool-1-thread-66] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 65 20:09:37.470 [pool-1-thread-143] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 142 20:09:37.468 [pool-1-thread-116] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 115 20:09:37.475 [pool-1-thread-65] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 64 20:09:37.464 [pool-1-thread-163] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 162 20:09:37.468 [pool-1-thread-58] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 57 20:09:37.475 [pool-1-thread-67] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 66 20:09:37.464 [pool-1-thread-151] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 150 20:09:37.468 [pool-1-thread-187] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 186 20:09:37.464 [pool-1-thread-162] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 161 20:09:37.468 [pool-1-thread-113] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 112 20:09:37.475 [pool-1-thread-68] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 67 20:09:37.464 [pool-1-thread-26] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 25 20:09:37.468 [pool-1-thread-131] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 130 20:09:37.470 [pool-1-thread-142] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 141 20:09:37.468 [pool-1-thread-114] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 113 20:09:37.468 [pool-1-thread-152] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 151 20:09:37.475 [pool-1-thread-69] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 68 20:09:37.464 [pool-1-thread-178] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 177 20:09:37.475 [pool-1-thread-70] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 69 20:09:37.468 [pool-1-thread-194] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 193 20:09:37.475 [pool-1-thread-71] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 70 20:09:37.475 [pool-1-thread-72] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 71 20:09:37.468 [pool-1-thread-112] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 111 20:09:37.475 [pool-1-thread-73] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 72 20:09:37.464 [pool-1-thread-172] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 171 20:09:37.464 [pool-1-thread-166] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 165 20:09:37.468 [pool-1-thread-198] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 197 20:09:37.475 [pool-1-thread-41] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 40 20:09:37.464 [pool-1-thread-177] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 176 20:09:37.464 [pool-1-thread-167] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 166 20:09:37.474 [pool-1-thread-44] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 43 20:09:37.468 [pool-1-thread-128] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 127 20:09:37.474 [pool-1-thread-42] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 41 20:09:37.468 [pool-1-thread-189] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 188 20:09:37.468 [pool-1-thread-136] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 135 20:09:37.470 [pool-1-thread-145] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 144 20:09:37.474 [pool-1-thread-43] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 42 20:09:37.470 [pool-1-thread-141] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 140 20:09:37.469 [pool-1-thread-150] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 149 20:09:37.464 [pool-1-thread-170] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 169 20:09:37.474 [pool-1-thread-46] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 45 20:09:37.468 [pool-1-thread-111] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 110 20:09:37.474 [pool-1-thread-45] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 44 20:09:37.468 [pool-1-thread-191] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 190 20:09:37.464 [pool-1-thread-156] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 155 20:09:37.468 [pool-1-thread-196] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 195 20:09:37.464 [pool-1-thread-161] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 160 20:09:37.474 [pool-1-thread-47] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 46 20:09:37.464 [pool-1-thread-165] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 164 20:09:37.464 [pool-1-thread-154] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 153 20:09:37.464 [pool-1-thread-75] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 74 20:09:37.464 [pool-1-thread-169] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 168 20:09:37.474 [pool-1-thread-48] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 47 20:09:37.468 [pool-1-thread-129] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 128 20:09:37.464 [pool-1-thread-158] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 157 20:09:37.468 [pool-1-thread-135] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 134 20:09:37.474 [pool-1-thread-49] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 48 20:09:37.464 [pool-1-thread-199] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 198 20:09:37.469 [pool-1-thread-149] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 148 20:09:37.468 [pool-1-thread-190] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 189 20:09:37.474 [pool-1-thread-50] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 49 20:09:37.464 [pool-1-thread-175] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 174 20:09:37.464 [pool-1-thread-185] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 184 20:09:37.464 [pool-1-thread-174] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 173 20:09:37.474 [pool-1-thread-51] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 50 20:09:37.464 [pool-1-thread-186] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 185 20:09:37.468 [pool-1-thread-200] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 199 20:09:37.468 [pool-1-thread-134] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 133 20:09:37.474 [pool-1-thread-53] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 52 20:09:37.470 [pool-1-thread-140] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 139 20:09:37.469 [pool-1-thread-148] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 147 20:09:37.468 [pool-1-thread-188] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 187 20:09:37.474 [pool-1-thread-52] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 51 20:09:37.470 [pool-1-thread-139] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 138 20:09:37.470 [pool-1-thread-147] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 146 20:09:37.464 [pool-1-thread-168] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 167 20:09:37.474 [pool-1-thread-55] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 54 20:09:37.464 [pool-1-thread-155] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 154 20:09:37.464 [pool-1-thread-160] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 159 20:09:37.468 [pool-1-thread-133] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 132 20:09:37.464 [pool-1-thread-176] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 175 20:09:37.468 [pool-1-thread-127] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 126 20:09:37.468 [pool-1-thread-195] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 194 20:09:37.464 [pool-1-thread-173] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 172 20:09:37.468 [pool-1-thread-192] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 191 20:09:37.468 [pool-1-thread-130] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - 129 20:09:37.640 [main] INFO com.yuxing.springbootdemo.juc.CountDownLatchExample - finish