因公司需要做一个对于CountDownLatch的分享,特写了此blog。
具体细节可以参见:小结java自带的跟锁相关的一些类
在做这个分享的过程中发现了Main和junit的运行的区别,在另外一个Blog细说。
详见:http://www.cnblogs.com/yangzhilong/p/6840791.html
1 package com.yzl.dubbo; 2 3 import java.util.Random; 4 import java.util.concurrent.BrokenBarrierException; 5 import java.util.concurrent.CountDownLatch; 6 import java.util.concurrent.CyclicBarrier; 7 import java.util.concurrent.Semaphore; 8 9 /** 10 * 测试CountDownLatch、CyclicBarrier、Semaphore 11 * 这里的测试请在Main方法中进行测试,在junit会出现问题,原因是:junit是Daemon线程 12 * 13 * @author yangzhilong 14 * 15 */ 16 public class MyTest { 17 18 public static void main(String[] args) { 19 MyTest myTest = new MyTest(); 20 myTest.testCountDownLatch(); 21 // myTest.testCyclicBarrier1(); 22 // myTest.testCyclicBarrier2(); 23 // myTest.testSemaphore(); 24 } 25 26 /** 27 * 测试CountDownLatch 28 * 29 */ 30 @org.junit.Test 31 public void testCountDownLatch(){ 32 CountDownLatch latch = new CountDownLatch(5); 33 34 Thread[] threads = new Thread[5]; 35 Thread thread = null; 36 37 System.out.println("begin.....................," + System.currentTimeMillis()); 38 for (int i = 0; i < 5; i++) { 39 final int index = i; 40 thread = new Thread(()->{ 41 42 System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis()); 43 //计数器减一 44 latch.countDown(); 45 try { 46 //等待计数器变成0 47 latch.await(); 48 } catch (InterruptedException e) { 49 e.printStackTrace(); 50 } 51 System.out.println("Thread-" + index + ",开始执行!!!," + System.currentTimeMillis()); 52 53 try { 54 Thread.sleep(new Random().nextInt(500)); 55 } catch (InterruptedException e1) { 56 e1.printStackTrace(); 57 } finally { 58 System.out.println("finally index:" + index); 59 } 60 System.out.println("Thread-" + index + ",执行完成!!!," + System.currentTimeMillis()); 61 62 }); 63 threads[i] = thread; 64 } 65 for (Thread t : threads) { 66 t.setDaemon(false); 67 t.start(); 68 } 69 System.out.println("end..............," + System.currentTimeMillis()); 70 } 71 72 /** 73 * 测试CyclicBarrier-1 74 */ 75 @org.junit.Test 76 public void testCyclicBarrier1(){ 77 CyclicBarrier cyclicBarrier = new CyclicBarrier(6); 78 79 System.out.println("begin.....................," + System.currentTimeMillis()); 80 for (int i = 0; i < 5; i++) { 81 final int index = i; 82 new Thread(()->{ 83 System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis()); 84 try { 85 cyclicBarrier.await(); 86 } catch (InterruptedException | BrokenBarrierException e) { 87 e.printStackTrace(); 88 } 89 System.out.println("Thread-" + index + ",开始执行!!!," + System.currentTimeMillis()); 90 91 try { 92 Thread.sleep(new Random().nextInt(500)); 93 } catch (InterruptedException e1) { 94 e1.printStackTrace(); 95 } 96 System.out.println("Thread-" + index + ",执行完成!!!," + System.currentTimeMillis()); 97 }).start();; 98 } 99 100 try { 101 cyclicBarrier.await(); 102 } catch (InterruptedException | BrokenBarrierException e) { 103 e.printStackTrace(); 104 } 105 106 System.out.println("end..............," + System.currentTimeMillis()); 107 } 108 109 /** 110 * 测试CyclicBarrier-2 111 * 程序中会重置计数器 112 */ 113 @org.junit.Test 114 public void testCyclicBarrier2(){ 115 CyclicBarrier cyclicBarrier = new CyclicBarrier(6); 116 117 System.out.println("begin.....................," + System.currentTimeMillis()); 118 for (int i = 0; i < 5; i++) { 119 final int index = i; 120 new Thread(()->{ 121 System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis()); 122 try { 123 cyclicBarrier.await(); 124 } catch (InterruptedException | BrokenBarrierException e) { 125 e.printStackTrace(); 126 } 127 System.out.println("Thread-" + index + ",开始执行!!!," + System.currentTimeMillis()); 128 129 try { 130 Thread.sleep(new Random().nextInt(500)); 131 } catch (InterruptedException e1) { 132 e1.printStackTrace(); 133 } 134 135 System.out.println("Thread-" + index + ",执行完成!!!," + System.currentTimeMillis()); 136 }).start();; 137 } 138 139 try { 140 cyclicBarrier.await(); 141 } catch (InterruptedException | BrokenBarrierException e) { 142 e.printStackTrace(); 143 } 144 145 System.out.println("end..............," + System.currentTimeMillis()); 146 147 //重置计数器 148 cyclicBarrier.reset(); 149 150 try { 151 cyclicBarrier.await(); 152 } catch (InterruptedException | BrokenBarrierException e) { 153 e.printStackTrace(); 154 } 155 System.out.println("我永远都不能被执行到"); 156 } 157 158 /** 159 * 测试Semaphore 160 */ 161 @org.junit.Test 162 public void testSemaphore(){ 163 Semaphore semaphore = new Semaphore(1); 164 165 System.out.println("begin....................."); 166 for (int i = 0; i < 5; i++) { 167 final int index = i; 168 new Thread(()->{ 169 System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis()); 170 try { 171 semaphore.acquire(); 172 } catch (InterruptedException e) { 173 e.printStackTrace(); 174 } 175 System.out.println("Thread-" + index + ",开始执行!!!"); 176 177 try { 178 Thread.sleep(new Random().nextInt(500)); 179 } catch (InterruptedException e1) { 180 e1.printStackTrace(); 181 } 182 183 System.out.println("Thread-" + index + ",执行完成!!!"); 184 semaphore.release(); 185 }).start(); 186 } 187 System.out.println("end.............."); 188 try { 189 Thread.sleep(100000L); 190 } catch (InterruptedException e) { 191 e.printStackTrace(); 192 } 193 } 194 }
运行结果:
begin.....................,1494483205995 end..............,1494483206092 Thread-0,准备执行!!!,1494483206094 Thread-2,准备执行!!!,1494483206094 Thread-3,准备执行!!!,1494483206094 Thread-4,准备执行!!!,1494483206094 Thread-1,准备执行!!!,1494483206094 Thread-1,开始执行!!!,1494483206094 Thread-2,开始执行!!!,1494483206095 Thread-0,开始执行!!!,1494483206095 Thread-3,开始执行!!!,1494483206095 Thread-4,开始执行!!!,1494483206095 finally index:4 Thread-4,执行完成!!!,1494483206260 finally index:1 Thread-1,执行完成!!!,1494483206390 finally index:0 Thread-0,执行完成!!!,1494483206483 finally index:3 Thread-3,执行完成!!!,1494483206548 finally index:2 Thread-2,执行完成!!!,1494483206567
begin.....................,1494483641348 Thread-0,准备执行!!!,1494483641454 Thread-1,准备执行!!!,1494483641454 Thread-2,准备执行!!!,1494483641454 Thread-3,准备执行!!!,1494483641455 Thread-4,准备执行!!!,1494483641455 end..............,1494483641455 Thread-1,开始执行!!!,1494483641456 Thread-0,开始执行!!!,1494483641456 Thread-2,开始执行!!!,1494483641456 Thread-3,开始执行!!!,1494483641456 Thread-4,开始执行!!!,1494483641456 Thread-3,执行完成!!!,1494483641502 Thread-0,执行完成!!!,1494483641509 Thread-4,执行完成!!!,1494483641545 Thread-1,执行完成!!!,1494483641564 Thread-2,执行完成!!!,1494483641692
begin.....................,1494483670144 Thread-0,准备执行!!!,1494483670268 Thread-1,准备执行!!!,1494483670268 Thread-2,准备执行!!!,1494483670268 Thread-3,准备执行!!!,1494483670268 Thread-4,准备执行!!!,1494483670268 Thread-4,开始执行!!!,1494483670269 Thread-3,开始执行!!!,1494483670269 Thread-2,开始执行!!!,1494483670269 Thread-0,开始执行!!!,1494483670269 Thread-1,开始执行!!!,1494483670269 end..............,1494483670269 Thread-3,执行完成!!!,1494483670399 Thread-2,执行完成!!!,1494483670404 Thread-1,执行完成!!!,1494483670486 Thread-0,执行完成!!!,1494483670536 Thread-4,执行完成!!!,1494483670553
begin..................... Thread-0,准备执行!!!,1494483690182 end.............. Thread-0,开始执行!!! Thread-1,准备执行!!!,1494483690183 Thread-2,准备执行!!!,1494483690183 Thread-3,准备执行!!!,1494483690184 Thread-4,准备执行!!!,1494483690184 Thread-0,执行完成!!! Thread-1,开始执行!!! Thread-1,执行完成!!! Thread-2,开始执行!!! Thread-2,执行完成!!! Thread-3,开始执行!!! Thread-3,执行完成!!! Thread-4,开始执行!!! Thread-4,执行完成!!!