Saturday, August 15, 2015

JavaMadeSoEasy.com: Implementation of custom/own CyclicBarrier in java - Detailed explanation with full program



JavaMadeSoEasy.com: Implementation of custom/own CyclicBarrier in java - Detailed explanation with full program
There might be situation where we might have to trigger event only when one or more threads completes certain operation.


2 or more threads wait for each other to reach a common barrier point. When all threads have reached common barrier point (i.e. when all threads have called await() method) >
  • All waiting threads are released, and
  • Event can be triggered as well.
  • int await() throws InterruptedException
If the current thread is not the last to arrive(i.e. call await() method) then it waits until one of the following things happens -
  • The last thread to call arrive(i,.e. call await() method), or
  • Some other thread interrupts the current thread, or
  • Some other thread interrupts one of the other waiting threads, or
  • Some other thread times out while waiting for barrier, or
  • Some other thread invokes reset() method on this cyclicBarrier.
  • CyclicBarrier’s  constructor >
    • CyclicBarrier(int parties)
    • CyclicBarrier(int parties, Runnable barrierAction)
  • CyclicBarrier’s await() method has 2 forms :
  • int await()
  • int await(long timeout, TimeUnit unit)
The barrier is called cyclic because CyclicBarrier can be reused after -
  • All the waiting threads are released and
  • event has been triggered.
class CyclicBarrierCustom{
 
   int initialParties; //total parties
   int partiesAwait; //parties yet to arrive
Runnable cyclicBarrrierEvent;
  
   /**
   * New CyclicBarrier is created where parties number of thread wait for each
   * other to reach common barrier point, when all threads have reached common
   * barrier point, parties number of waiting threads are released and
   * barrierAction (event) is triggered.
   */
   public CyclicBarrierCustom(int parties, Runnable cyclicBarrrierEvent) {
          initialParties=parties;
          partiesAwait=parties;  
          this.cyclicBarrrierEvent=cyclicBarrrierEvent;
   }
   /**
   * If the current thread is not the last to arrive(i.e. call await() method) then
   it waits until one of the following things happens -
                 - The last thread to call arrive(i,.e. call await() method), or
                 - Some other thread interrupts the current thread, or
                 - Some other thread interrupts one of the other waiting threads, or
                 - Some other thread times out while waiting for barrier, or
                 - Some other thread invokes reset() method on this cyclicBarrier.
   */
   public synchronized void await() throws InterruptedException {
          //decrements awaiting parties by 1.
          partiesAwait--;
         
          //If the current thread is not the last to arrive, thread will wait.
          if(partiesAwait>0){
                 this.wait();
          }
          /*If the current thread is last to arrive, notify all waiting threads, and
          launch event*/
          else{
                 /* All parties have arrive, make partiesAwait equal to initialParties,
                  so that CyclicBarrier could become cyclic. */
                 partiesAwait=initialParties;
                
                 notifyAll(); //notify all waiting threads
                
                 cyclicBarrrierEvent.run(); //launch event
          }
   }
}
Read full article from JavaMadeSoEasy.com: Implementation of custom/own CyclicBarrier in java - Detailed explanation with full program

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts