From 2bb31e54ed12726658333d4f7e307bf77a9413db Mon Sep 17 00:00:00 2001 From: Chandravadan S Date: Mon, 26 Jun 2017 14:42:00 +0530 Subject: [PATCH] Cyclic Barriers demo (#2156) --- .../cyclicbarrier/CyclicBarrierDemo.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java diff --git a/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java b/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java new file mode 100644 index 0000000000..69b6d46599 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java @@ -0,0 +1,86 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; + +/** + * Created by cv on 24/6/17. + */ +public class CyclicBarrierDemo { + + private CyclicBarrier cyclicBarrier; + private List> partialResults = Collections.synchronizedList(new ArrayList<>()); + private Random random = new Random(); + private int NUM_PARTIAL_RESULTS; + private int NUM_WORKERS; + + + public void runSimulation(int numWorkers, int numberOfPartialResults) { + NUM_PARTIAL_RESULTS = numberOfPartialResults; + NUM_WORKERS = numWorkers; + + cyclicBarrier = new CyclicBarrier(NUM_WORKERS, new AggregatorThread()); + System.out.println("Spawning " + NUM_WORKERS + " worker threads to compute " + + NUM_PARTIAL_RESULTS + " partial results each"); + for (int i = 0; i < NUM_WORKERS; i++) { + Thread worker = new Thread(new NumberCruncherThread()); + worker.setName("Thread " + i); + worker.start(); + } + } + + class NumberCruncherThread implements Runnable { + + @Override + public void run() { + String thisThreadName = Thread.currentThread().getName(); + List partialResult = new ArrayList<>(); + for (int i = 0; i < NUM_PARTIAL_RESULTS; i++) { + Integer num = random.nextInt(10); + System.out.println(thisThreadName + + ": Crunching some numbers! Final result - " + num); + partialResult.add(num); + } + partialResults.add(partialResult); + try { + System.out.println(thisThreadName + " waiting for others to reach barrier."); + cyclicBarrier.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BrokenBarrierException e) { + e.printStackTrace(); + } + } + } + + class AggregatorThread implements Runnable { + + @Override + public void run() { + String thisThreadName = Thread.currentThread().getName(); + System.out.println(thisThreadName + ": Computing final sum of " + NUM_WORKERS + + " workers, having " + NUM_PARTIAL_RESULTS + " results each."); + int sum = 0; + for (List threadResult : partialResults) { + System.out.print("Adding "); + for (Integer partialResult : threadResult) { + System.out.print(partialResult+" "); + sum += partialResult; + } + System.out.println(); + } + System.out.println(Thread.currentThread().getName() + ": Final result = " + sum); + } + + } + + public static void main(String[] args) { + CyclicBarrierDemo play = new CyclicBarrierDemo(); + play.runSimulation(5, 3); + } + +}