1. 程式人生 > >J.U.C 的同步工具類

J.U.C 的同步工具類

agg googl rri void 之前 ron code number cat

介紹幾個同步工具類,很簡單、常用。

說些廢話啊,最近wo在學習的過程中,多用google搜索,此外,查類的時候,會多看Java api 8 的英文文檔,覺得收獲很多。

1.CyclicBarrier

它允許一組線程在到達一個共同柵欄之前,相互等待,全都到達之後,再一起前進。與Countdown的去別是,它可以設置多個共同的柵欄,而CountDown只能設置一次。

我們看看api中的構造方法:

CyclicBarrier(int parties): parties表示這組線程的數量

CyclicBarrier(int parties, Runnable barrierAction):barrierAction表示的是,在這組線程全都達到共同柵欄後,所觸發的任務。這個任務是由最後到達共同柵欄的線程來執行。

下面看代碼的例子:

 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 import java.util.List;
 4 import java.util.Random;
 5 import java.util.concurrent.BrokenBarrierException;
 6 import java.util.concurrent.CyclicBarrier;
 7 
// 這個demo,是多個線程隨機產生數字,放在list中,等到所有線程都產生完數字後(共同柵欄),再對所有數字進行求和
// 測試結果,自己運行一下就好!
8 public class CyclicBarrierDemo { 9 10 private CyclicBarrier cyclicBarrier; 11 private List<List<Integer>> partialResults 12 = Collections.synchronizedList(new ArrayList<>()); 13 private Random random = new Random(); 14 private int NUM_PARTIAL_RESULTS;
15 private int NUM_WORKERS; 16 17 class NumberCruncherThread implements Runnable { 18 19 @Override 20 public void run() { 21 String thisThreadName = Thread.currentThread().getName(); 22 List<Integer> partialResult = new ArrayList<>(); 23 24 // Crunch some numbers and store the partial result 25 for (int i = 0; i < NUM_PARTIAL_RESULTS; i++) { 26 Integer num = random.nextInt(10); 27 System.out.println(thisThreadName 28 + ": Crunching some numbers! Final result - " + num); 29 partialResult.add(num); 30 } 31 32 partialResults.add(partialResult); 33 try { 34 System.out.println(thisThreadName 35 + " waiting for others to reach barrier."); 36 cyclicBarrier.await(); 37
// 紅色部分添加的目的就是,純粹是為了展示cyclicbarrier可以多次重復設置共同柵欄 38 System.out.println("No.2 thread name " + thisThreadName); 39 cyclicBarrier.await(); 40 41 System.out.println("No.3 thread name " + thisThreadName); 42 cyclicBarrier.await(); 43 } catch (InterruptedException e) { 44 // ... 45 } catch (BrokenBarrierException e) { 46 // 當await超時,所示await阻塞的線程被中斷時,那麽所有阻塞的線程將被終止,並報出BrokenBarrierException 47 } 48 } 49 } 50 51 class AggregatorThread implements Runnable { 52 53 @Override 54 public void run() { 55 56 String thisThreadName = Thread.currentThread().getName(); 57 58 System.out.println( 59 thisThreadName + ": Computing sum of " + NUM_WORKERS 60 + " workers, having " + NUM_PARTIAL_RESULTS + " results each."); 61 int sum = 0; 62 63 for (List<Integer> threadResult : partialResults) { 64 System.out.print("Adding "); 65 for (Integer partialResult : threadResult) { 66 System.out.print(partialResult+" "); 67 sum += partialResult; 68 } 69 System.out.println(); 70 } 71 System.out.println(thisThreadName + ": Final result = " + sum); 72 } 73 } 74 75 public void runSimulation(int numWorkers, int numberOfPartialResults) { 76 NUM_PARTIAL_RESULTS = numberOfPartialResults; 77 NUM_WORKERS = numWorkers; 78 79 cyclicBarrier = new CyclicBarrier(NUM_WORKERS, new AggregatorThread()); 80 81 System.out.println("Spawning " + NUM_WORKERS 82 + " worker threads to compute " 83 + NUM_PARTIAL_RESULTS + " partial results each"); 84 85 for (int i = 0; i < NUM_WORKERS; i++) { 86 Thread worker = new Thread(new NumberCruncherThread()); 87 worker.setName("Thread " + i); 88 worker.start(); 89 } 90 } 91 92 public static void main(String[] args) { 93 CyclicBarrierDemo demo = new CyclicBarrierDemo(); 94 demo.runSimulation(5, 3); 95 } 96 }

後續陸續補充。。。

J.U.C 的同步工具類