@Override
  public void run() {
    final boolean isDebugEnabled = logger.isDebugEnabled();

    for (int i = 0; i < processors.length; i++) {
      if (isDebugEnabled) {
        logger.debug("Starting the ParallelProcessors {}", i);
      }
      processors[i].start();
    }
    try {
      waitForRunningStatus();
    } catch (GatewaySenderException e) {
      ex = e;
    }

    synchronized (getRunningStateLock()) {
      if (ex != null) {
        setException(ex);
        setIsStopped(true);
      } else {
        setIsStopped(false);
      }
      getRunningStateLock().notifyAll();
    }

    for (ParallelGatewaySenderEventProcessor parallelProcessor : processors) {
      try {
        parallelProcessor.join();
      } catch (InterruptedException e) {
        if (isDebugEnabled) {
          logger.debug("Got InterruptedException while waiting for child threads to finish.");
          Thread.currentThread().interrupt();
        }
      }
    }
  }
Parallel processor which constitutes of multiple {@link ParallelGatewaySenderEventProcessor}.
Each of the {@link ParallelGatewaySenderEventProcessor} is responsible of dispatching events from
a set of shadowPR or buckets. Once the buckets/shadowPRs are assigned to a processor it should
not change to avoid any event ordering issue.

The {@link ParallelGatewaySenderQueue} should be shared among all the
{@link ParallelGatewaySenderEventProcessor}s.
geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ConcurrentParallelGatewaySenderEventProcessor.java