docs: @Override
      public void setupNeighborConcurrent(String groupName, JobConcurrentExec concurrentExec, Set<LaJobKey> jobKeySet) {
          assertArgumentNotNull("groupName", groupName);
          if (groupName.trim().isEmpty()) {
              throw new IllegalArgumentException("The argument 'groupName' should not be empty: [" + groupName + "]");
          }
          assertArgumentNotNull("concurrentExec", concurrentExec);
          assertArgumentNotNull("jobKeySet", jobKeySet);
          if (jobKeySet.size() <= 1) {
              throw new IllegalArgumentException("The specified jobs should be two or more: " + jobKeySet);
          }
          synchronized (neighborConcurrentMap) {
              checkDuplicateNeighborConcurrentGroup(groupName);
              final Object groupPreparingLock = new Object();
              final Object groupRunningLock = new Object();
              final CopyOnWriteArraySet<LaJobKey> safeSet = new CopyOnWriteArraySet<LaJobKey>(jobKeySet);
              final NeighborConcurrentGroup group =
                      new NeighborConcurrentGroup(groupName, concurrentExec, safeSet, groupPreparingLock, groupRunningLock);
              neighborConcurrentMap.put(groupName, group);
              safeSet.stream().map(jobKey -> findJobByKey(jobKey).get()).forEach(job -> { // or job not found
                  job.registerNeighborConcurrent(groupName, group);
              });
          }
      }