@Override
	/*
	 * (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	public void run() {
		while (true) {
			try {
				Order deliverOrder= this._deliverBlockingQueue.take();
				if (deliverOrder == Management.cyanide)
					break;
				logAsBeingDelivered(deliverOrder.getID());
				long timeToDeliverOneWay= calculateDeliveryTime(deliverOrder);
				long timeBeforeDeliver= System.currentTimeMillis();
				Thread.sleep(timeToDeliverOneWay);
				deliverOrder.setStatusAsDelivered(this._name, deliverOrder.getID());
				long timeAfterDeliver= System.currentTimeMillis();
				long actualDeliveryTime= timeAfterDeliver - timeBeforeDeliver;
				long expextedCookTime= deliverOrder.getExpextedCookTime();
				long actualCookTime= deliverOrder.getActualCookTime();
				if(actualCookTime == Order.NULL_COOK_TIME){
					throw new RuntimeException("Order was not cooked!");
				}
				double OrderReward= deliverOrder.calculateOrderReward();
				if((actualCookTime + actualDeliveryTime) > (1.15 * (expextedCookTime + timeToDeliverOneWay))){
					OrderReward= 0.5 * OrderReward;
					deliverOrder.setIfOrderWasDeliveredFastEnough(false);
				}
				else
					deliverOrder.setIfOrderWasDeliveredFastEnough(true);
				Thread.sleep(timeToDeliverOneWay);
				this._ordersDelivered.add(deliverOrder);
				this._stats.updateStatistics(deliverOrder, OrderReward);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this._signalOnDeath.countDown();
	}