code: public void addExceptionThrown(int partIndex, Throwable throwable) {
          long eventIndex = nextEventIndexMap.get(partIndex).getAndIncrement();
          PartitionChangedEvent<Solution_> event = new PartitionChangedEvent<>(
                  partIndex, eventIndex, throwable);
          queue.add(event);
      }
docs: This method is thread-safe.
  The previous move for this partIndex (if it hasn't been consumed yet), will still be returned during iteration
  before the iteration throws an exception.
  @param partIndex {@code 0 <= partIndex < partCount}
  @param throwable never null
  @see BlockingQueue#add(Object)