protected boolean pickAndExecuteAnAction() {

    synchronized (orders) {
      for (Order o : orders) {
        if (o.state == OrderState.UnableToBeSupplied) {
          TellWaiterWeAreOut(o);
          return true;
        }
      }
    }
    synchronized (orders) {
      for (Order o : orders) {
        if (o.state == OrderState.NotReady) {
          o.state = OrderState.BeingPrepared;
          PrepareOrder(o);
          return true;
        }
      }
    }
    synchronized (orders) {
      for (Order o : orders) {
        if (o.state == OrderState.Ready) {
          OrderIsReady(o);
          return true;
        }
      }
    }
    synchronized (marketOrders) {
      for (MarketOrder mo : marketOrders) {
        if (mo.os == moState.pending) {
          print("Ordering " + mo.amount + " " + mo.food + "'s");
          mo.os = moState.ordered;
          print("COWABUNGA ordering from market");
          goToMarket(restaurant, "Italian", mo.amount, mo.id);
          return true;
        }
      }
    }
    // Producer-consumer handling
    StandOrder orderFromStand = restaurant.revolvingStand.remove();
    if (orderFromStand != null) {

      WaiterAgent standWaiter = orderFromStand.waiter;
      int standTableNum = orderFromStand.tableNum;
      String standOrderType = orderFromStand.order;

      if (menu.menuItems.containsKey(orderFromStand.order)
          && inventory.get(orderFromStand.order) > 0) {
        long timeFinish =
            (System.currentTimeMillis()
                + (long) ((menu.menuItems.get(standOrderType)) * Constants.SECOND));
        Order newStandOrder = new Order(standWaiter, standTableNum, standOrderType, timeFinish);
        AddNewOrderFromStand(newStandOrder);
      }
      return true;
    }
    return false;
  }