因公司須要作一個對於CountDownLatch的分享,特寫了此blog。html
在作這個分享的過程當中發現了Main和junit的運行的區別,在另一個Blog細說。java
詳見:http://www.cnblogs.com/yangzhilong/p/6840791.htmldom
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 }
運行結果:post
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,執行完成!!!