code: private void finishCompletion() {
          // assert state > COMPLETING;
          for (WaitNode q; (q = waiters) != null;) {
              if (U.compareAndSwapObject(this, WAITERS, q, null)) {
                  for (;;) {
                      Thread t = q.thread;
                      if (t != null) {
                          q.thread = null;
                          LockSupport.unpark(t);
                      }
                      WaitNode next = q.next;
                      if (next == null)
                          break;
                      q.next = null; // unlink to help gc
                      q = next;
                  }
                  break;
              }
          }
  
          done();
  
          callable = null;        // to reduce footprint
      }
docs: Removes and signals all waiting threads, invokes done(), and
  nulls out callable.