2018-03-1620:21:30.967[Thread-1] INFO c.c.actual.ThreadCommunication - running2 2018-03-1620:21:30.967[Thread-0] INFO c.c.actual.ThreadCommunication - running 2018-03-1620:21:34.972[main] INFO c.c.actual.ThreadCommunication - main over
countDown.await(); longstop= System.currentTimeMillis(); LOGGER.info("main over total time={}",stop-start); }
输出结果:
1 2 3 4 5 6 7
2018-03-16 20:19:44.126 [Thread-0] INFO c.c.actual.ThreadCommunication - thread run 2018-03-16 20:19:44.126 [Thread-2] INFO c.c.actual.ThreadCommunication - thread run 2018-03-16 20:19:44.126 [Thread-1] INFO c.c.actual.ThreadCommunication - thread run 2018-03-16 20:19:46.136 [Thread-2] INFO c.c.actual.ThreadCommunication - thread end 2018-03-16 20:19:46.136 [Thread-1] INFO c.c.actual.ThreadCommunication - thread end 2018-03-16 20:19:46.136 [Thread-0] INFO c.c.actual.ThreadCommunication - thread end 2018-03-16 20:19:46.136 [main] INFO c.c.actual.ThreadCommunication - main over total time=2012
LOGGER.info("thread end do something"); } }).start();
LOGGER.info("main thread"); }
CyclicBarrier 中文名叫做屏障或者是栅栏,也可以用于线程间通信。
它可以等待 N 个线程都达到某个状态后继续运行的效果。
首先初始化线程参与者。
调用 await() 将会在所有参与者线程都调用之前等待。
直到所有参与者都调用了 await() 后,所有线程从 await() 返回继续后续逻辑。
运行结果:
1 2 3 4 5 6 7
2018-03-18 22:40:00.731 [Thread-0] INFO c.c.actual.ThreadCommunication - thread run 2018-03-18 22:40:00.731 [Thread-1] INFO c.c.actual.ThreadCommunication - thread run 2018-03-18 22:40:00.731 [Thread-2] INFO c.c.actual.ThreadCommunication - thread run 2018-03-18 22:40:00.731 [main] INFO c.c.actual.ThreadCommunication - main thread 2018-03-18 22:40:05.741 [Thread-0] INFO c.c.actual.ThreadCommunication - thread end do something 2018-03-18 22:40:05.741 [Thread-1] INFO c.c.actual.ThreadCommunication - thread end do something 2018-03-18 22:40:05.741 [Thread-2] INFO c.c.actual.ThreadCommunication - thread end do something
poolExecutor.shutdown(); while (!poolExecutor.awaitTermination(1,TimeUnit.SECONDS)){ LOGGER.info("线程还在执行。。。"); } LOGGER.info("main over"); }
输出结果:
1 2 3 4 5
2018-03-1620:18:01.273[pool-1-thread-2] INFO c.c.actual.ThreadCommunication - running2 2018-03-1620:18:01.273[pool-1-thread-1] INFO c.c.actual.ThreadCommunication - running 2018-03-1620:18:02.273[main] INFO c.c.actual.ThreadCommunication - 线程还在执行。。。 2018-03-1620:18:03.278[main] INFO c.c.actual.ThreadCommunication - 线程还在执行。。。 2018-03-1620:18:04.278[main] INFO c.c.actual.ThreadCommunication - main over
2018-03-1619:56:43.014[Thread-0] INFO c.c.actual.ThreadCommunication - running 2018-03-1619:56:43.014[Thread-1] INFO c.c.actual.ThreadCommunication - running2 2018-03-1619:56:43.130[Thread-1] INFO c.c.actual.ThreadCommunication - msg=0 2018-03-1619:56:43.132[Thread-1] INFO c.c.actual.ThreadCommunication - msg=1 2018-03-1619:56:43.132[Thread-1] INFO c.c.actual.ThreadCommunication - msg=2 2018-03-1619:56:43.133[Thread-1] INFO c.c.actual.ThreadCommunication - msg=3 2018-03-1619:56:43.133[Thread-1] INFO c.c.actual.ThreadCommunication - msg=4 2018-03-1619:56:43.133[Thread-1] INFO c.c.actual.ThreadCommunication - msg=5 2018-03-1619:56:43.133[Thread-1] INFO c.c.actual.ThreadCommunication - msg=6 2018-03-1619:56:43.134[Thread-1] INFO c.c.actual.ThreadCommunication - msg=7 2018-03-1619:56:43.134[Thread-1] INFO c.c.actual.ThreadCommunication - msg=8 2018-03-1619:56:43.134[Thread-1] INFO c.c.actual.ThreadCommunication - msg=9