code: @Override
    public void run() {
      // 1) validate propagation is executed at the context of the right epoch, otherwise abort
      if (!sharedThetaSketch.validateEpoch(epoch)) {
        // invalid epoch - should not propagate
        sharedThetaSketch.endPropagation(null, false);
        return;
      }
  
      // 2) handle propagation: either of a single hash or of a sketch
      if (singleHash != ConcurrentSharedThetaSketch.NOT_SINGLE_HASH) {
        sharedThetaSketch.propagate(singleHash);
      } else if (sketchIn != null) {
        final long volTheta = sharedThetaSketch.getVolatileTheta();
        assert volTheta <= sketchIn.getThetaLong() :
            "volTheta = " + volTheta + ", bufTheta = " + sketchIn.getThetaLong();
  
        // propagate values from input sketch one by one
        final long[] cacheIn = sketchIn.getCache();
  
        if (sketchIn.isOrdered()) { //Ordered compact, Use early stop
          for (final long hashIn : cacheIn) {
            if (hashIn >= volTheta) {
              break; //early stop
            }
            sharedThetaSketch.propagate(hashIn);
          }
        } else { //not ordered, also may have zeros (gaps) in the array.
          for (final long hashIn : cacheIn) {
            if (hashIn > 0) {
              sharedThetaSketch.propagate(hashIn);
            }
          }
        }
      }
  
      // 3) complete propagation: ping local buffer
      sharedThetaSketch.endPropagation(localPropagationInProgress, false);
    }
docs: Propagation protocol:
  1) validate propagation is executed at the context of the right epoch, otherwise abort
  2) handle propagation: either of a single hash or of a sketch
  3) complete propagation: ping local buffer