public LoadBalancer build() { loadBalancer.suspensionTimes = new AtomicLongArray(loadBalancer.endpointCount); loadBalancer.successCounters = new AtomicLongArray(loadBalancer.endpointCount); loadBalancer.failureCounters = new AtomicLongArray(loadBalancer.endpointCount); loadBalancer.failureTimes = new AtomicLongArray[loadBalancer.endpointCount]; for (int i = 0; i < loadBalancer.failureTimes.length; i++) { loadBalancer.failureTimes[i] = new AtomicLongArray(loadBalancer.failureRateMaxFailures); } // Setup monitor if it has been set if (loadBalancer.monitorFunction != null) { loadBalancer.monitorUnhealthyCounters = new AtomicIntegerArray(loadBalancer.endpointCount); loadBalancer.monitorHealthyCounters = new AtomicIntegerArray(loadBalancer.endpointCount); loadBalancer.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); loadBalancer.scheduledExecutorService.scheduleWithFixedDelay( () -> { loadBalancer.checkMonitors(); }, 0, loadBalancer.monitorCheckInterval, loadBalancer.monitorCheckTimeUnit); } return loadBalancer; }