@@ -334,6 +334,83 @@ CountDownLatch 也是基于 AQS(AbstractQueuedSynchronizer) 实现的,更多
334
334
- 该方法会将 AQS 内置的一个 state 状态 -1 。
335
335
- 最终在主线程调用 await() 方法,它会阻塞直到 ` state == 0 ` 的时候返回。
336
336
337
+ ## CyclicBarrier 并发工具
338
+
339
+ ``` java
340
+ private static void cyclicBarrier() throws Exception {
341
+ CyclicBarrier cyclicBarrier = new CyclicBarrier (3 ) ;
342
+
343
+ new Thread (new Runnable () {
344
+ @Override
345
+ public void run () {
346
+ LOGGER . info(" thread run" );
347
+ try {
348
+ cyclicBarrier. await() ;
349
+ } catch (Exception e) {
350
+ e. printStackTrace();
351
+ }
352
+
353
+ LOGGER . info(" thread end do something" );
354
+ }
355
+ }). start();
356
+
357
+ new Thread (new Runnable () {
358
+ @Override
359
+ public void run () {
360
+ LOGGER . info(" thread run" );
361
+ try {
362
+ cyclicBarrier. await() ;
363
+ } catch (Exception e) {
364
+ e. printStackTrace();
365
+ }
366
+
367
+ LOGGER . info(" thread end do something" );
368
+ }
369
+ }). start();
370
+
371
+ new Thread (new Runnable () {
372
+ @Override
373
+ public void run () {
374
+ LOGGER . info(" thread run" );
375
+ try {
376
+ Thread . sleep(5000 );
377
+ cyclicBarrier. await() ;
378
+ } catch (Exception e) {
379
+ e. printStackTrace();
380
+ }
381
+
382
+ LOGGER . info(" thread end do something" );
383
+ }
384
+ }). start();
385
+
386
+ LOGGER . info(" main thread" );
387
+ }
388
+ ```
389
+
390
+ CyclicBarrier 中文名叫做屏障或者是栅栏,也可以用于线程间通信。
391
+
392
+ 它可以等待 N 个线程都达到某个状态后继续运行的效果。
393
+
394
+ 1 . 首先初始化线程参与者。
395
+ 2 . 调用 ` await() ` 将会在所有参与者线程都调用之前等待。
396
+ 3 . 直到所有参与者都调用了 ` await() ` 后,所有线程从 ` await() ` 返回继续后续逻辑。
397
+
398
+ 运行结果:
399
+
400
+ ```
401
+ 2018-03-18 22:40:00.731 [Thread-0] INFO c.c.actual.ThreadCommunication - thread run
402
+ 2018-03-18 22:40:00.731 [Thread-1] INFO c.c.actual.ThreadCommunication - thread run
403
+ 2018-03-18 22:40:00.731 [Thread-2] INFO c.c.actual.ThreadCommunication - thread run
404
+ 2018-03-18 22:40:00.731 [main] INFO c.c.actual.ThreadCommunication - main thread
405
+ 2018-03-18 22:40:05.741 [Thread-0] INFO c.c.actual.ThreadCommunication - thread end do something
406
+ 2018-03-18 22:40:05.741 [Thread-1] INFO c.c.actual.ThreadCommunication - thread end do something
407
+ 2018-03-18 22:40:05.741 [Thread-2] INFO c.c.actual.ThreadCommunication - thread end do something
408
+ ```
409
+
410
+ 可以看出由于其中一个线程休眠了五秒,所有其余所有的线程都得等待这个线程调用 ` await() ` 。
411
+
412
+ 该工具可以实现 CountDownLatch 同样的功能,但是要更加灵活。甚至可以调用 ` reset() ` 方法重置 CyclicBarrier (需要自行捕获 BrokenBarrierException 处理) 然后重新执行。
413
+
337
414
## 线程响应中断
338
415
339
416
``` java
0 commit comments