/** Retira o próximo evento da fila de prioridades, e o trata. */
  public void handleEvents() {
    // Não é esperado que esta lista esteja vazia...
    if (getEvents().isEmpty()) throw new RuntimeException();
    // Evento é retornado e deletado da fila.
    Event event = getEvents().poll();

    currentTime = event.getTime();
    switch (event.getType()) {
      case CongestionPacketIntoRouter:
        handleCongestionPacketIntoRouterEvent(event);
        break;
      case TxPacketIntoRouter:
        handleTxPacketIntoRouter(event);
        break;
      case Timeout:
        handleTimeout(event);
        break;
      case RouterSuccessfullySentPacket:
        handleRouterSuccessfullySentPacket(event);
        break;
      case TxPacketHeadsToRouter:
        handleTxPacketHeadsToRouter(event);
        break;
      case SackArrives:
        handleSackArrives(event);
        break;
      default:
        throw new RuntimeException(); // Não deve existir outro evento...
    }
  }