content: package simulator.runmodel;
  
  /**
   * ber alle Threads synchronisierte Zhlung der Anknfte, um so die Kunden
   * pro Thread dynamisch anpassen zu knnen.
   * @author Alexander Herzog
   * @see RunData#nextClientIsLast(SimulationData)
   */
  public class DynamicLoadBalancer {
  	/** Minimale Gre fr ein Anknfte-Paket */
  	private static final long MIN_LOAD_PACKAGE_SIZE=1_000;
  
  	/** Gesamtzahl der zu simulierenden Anknfte */
  	private volatile long arrivalsToBeSimulated;
  	/** 25% von {@link #arrivalsToBeSimulated} */
  	private final long last25Percent;
  	/** Groes Anknfte-Paket (wird vor Erreichen der letzten 25% jeweils ausgeliefert) */
  	private final long arrivalPackageLarge;
  	/** Kleines Anknfte-Paket (wird ab dem Erreichen der letzten 25% jeweils ausgeliefert) */
  	private final long arrivalPackageSmall;
  
  	/**
  	 * Konstruktor der Klasse
  	 * @param arrivalsToBeSimulated	Gesamtzahl der zu simulierenden Anknfte
  	 * @param threadCount	Anzahl an Threads
  	 */
  	public DynamicLoadBalancer(final long arrivalsToBeSimulated, final int threadCount) {
  		this.arrivalsToBeSimulated=arrivalsToBeSimulated;
  		this.last25Percent=arrivalsToBeSimulated/4;
  		this.arrivalPackageLarge=Math.min(Math.max(MIN_LOAD_PACKAGE_SIZE,arrivalsToBeSimulated/threadCount/250),last25Percent);
  		this.arrivalPackageSmall=Math.max(MIN_LOAD_PACKAGE_SIZE,arrivalsToBeSimulated/threadCount/2000);
  	}
  
  	/**
  	 * Liefert (synchronisiert) das nchste Paket von zulssigen Anknften
  	 * @return	Anknfte fr den Thread (kann 0 sein, wenn der Thread keine weiteren Anknfte generieren soll)
  	 */
  	public long getArrivals() {
  		synchronized(this) {
  			if (arrivalsToBeSimulated>last25Percent) {
  				arrivalsToBeSimulated-=arrivalPackageLarge;
  				return arrivalPackageLarge;
  			} else {
  				if (arrivalsToBeSimulated>arrivalPackageSmall) {
  					arrivalsToBeSimulated-=arrivalPackageSmall;
  					return arrivalPackageSmall;
  				} else {
  					final long arrivalThisPackage=arrivalsToBeSimulated;
  					arrivalsToBeSimulated=0;
  					return arrivalThisPackage;
  				}
  			}
  		}
  	}
  }
  