title: Understanding phaser in java with an example
body: <p>I am trying to understand Phaser in java. I wrote an example which is stuck at advance waiting for other parties to arrive.</p>
  
  <p>As far as I understand, phaser is used as a reusable thread synchronization (unlike CountdownLatch which is not reusable) barrier with a barrier action (unlike Cyclicbarrier which is used to share state, Phaser doesn't have to share state in barrier action). Correct me if I am wrong.</p>
  
  <p>So, in my example, I am trying to execute some random addition and subtraction code in each thread after certain number of parties/threads reach the barrier. What am I doing wrong?</p>
  
  <pre><code>import static java.lang.String.*;
  
  import java.util.Random;
  import java.util.concurrent.Callable;
  import java.util.concurrent.CompletionService;
  import java.util.concurrent.ExecutionException;
  import java.util.concurrent.ExecutorCompletionService;
  import java.util.concurrent.ExecutorService;
  import java.util.concurrent.Executors;
  import java.util.concurrent.Phaser;
  import java.util.stream.IntStream;
  
  public class PhaserUsage implements Callable&lt;String&gt; {
  
      private static final int THREAD_POOL_SIZE = 10;
      private final Phaser phaser;
  
      private PhaserUsage(Phaser phaser) {
          this.phaser = phaser;
      }
  
      public static void main(String a[]) {
          ExecutorService execService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
          CompletionService&lt;String&gt; completionService = new ExecutorCompletionService&lt;&gt;(execService);
  
          Phaser phaser = new Phaser(1);
          IntStream.range(0, THREAD_POOL_SIZE)
                  .forEach(nbr -&gt; completionService.submit(new PhaserUsage(phaser)));
  
          execService.shutdown();
  
           try {
               while (!execService.isTerminated()) {
                  String result = completionService.take().get();
                  System.out.println(format("Result is: %s", result));
               }
            } catch (ExecutionException | InterruptedException e) {
               e.printStackTrace();
            }
      }
  
      @Override
      public String call() {
          String threadName = Thread.currentThread().getName();
          System.out.println(format("Registering...%s",threadName));
          phaser.register();
          System.out.println(format("Arrive and await advance...%s",threadName));
          phaser.arriveAndAwaitAdvance(); // await all creation
          int a = 0, b = 1;
          Random random = new Random();
          for (int i = 0; i &lt; random.nextInt(10000000); i++) {
              a = a + b;
              b = a - b;
          }
          System.out.println(format("De-registering...%s",threadName));
          phaser.arriveAndDeregister();
          return format("Thread %s results: a = %s, b = %s", threadName, a, b);
      }
  }
  </code></pre>