1. 程式人生 > >j.u.c—CountDownLatch

j.u.c—CountDownLatch

      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