Calcular tempo em que um Objeto permanece na Fila

Implementei todos os métodos de uma fila com controle de prioridades, porém meu professor quer que eu crie uma central de impressão que informe o seguinte:
1 - Informar os clientes que ainda estão na fila (feito);
2 - Calcular o tempo em que o cliente(Objeto) fica na fila. Caso passe de 15s, o banco pagará uma multa de R$1000,00. Obs:Quer que utilize System.currentTimeMillis() para cálculo do tempo.
3 - Informar os clientes que já foram atendidos e o tempo gasto em cada um;
4 - Exibir a quantidade e o total de multa diária que o banco deve pagar.

Obs: Não estou usando vetor, array…, é uma fila de NoPrioridade (Classe que implementa as variáveis).

Para armazenar os clientes atendidos, estou pensando em criar um vetor para guardar o nome do cliente e o tempo gasto no atendimento. O que acham?
Mas a principal dúvida é: como calcular o tempo gasto em cada atendimento?
Caso julguem necessário posto o código do programa.

Você pode obter o tempo decorrido entre dois objetos Date, ou entre um Date e o tempo atual, com uma simples subtração.

System.currentTimeMillis() - date.getTime()

1 curtida

Olá

Não sei como está implementado a sua fila, mas espero que seja mais ou menos assim:

classe NoPrioridade
    Cliente cliente;
    NoPrioridade proximo; //  proximo da fila

Sugiro que crie uma classe cliente ou algo similar.

classe Cliente
    String nome;
    long instanteDeEntrada = -1;
    long instanteDeSaida = -1;

Quando o cliente entrar na fila, o valor do instanteDeEntrada deve receber o valor System.currentTimeMillis() e quando sair da fila o valor do instanteDeSaida deve receber o System.currentTimeMillis().

Para calcular o tempo que ficou na fila, basta fazer a diferença entre o instanteDeSaida com o instanteDeEntrada e converter para segundos (dividir por mil) e para calcular o tempo que está na fila, calcule a diferença do tempo atual (System.currentTimeMillis()) com o instanteDeEntrada.

A estrutura é a seguinte:
Tenho as classes Gestante, Idoso, CaixaRapido, CaixaNormal e Furao que herdam da classe Operacao.
Existe composição entre a classe Operacao e a classe NoPrioridade.
Segue código das classes FilaDePrioridades e NoPrioridade.

package trabalho;

import interfaces.Fila;
import interfaces.Imprimivel;
import javax.swing.JOptionPane;
import excecoes.*;

public class FilaDePrioridades implements Fila, Imprimivel{

NoPrioridade frente, cauda;
int tamanho,pos;
private NoPrioridade[] array;

public FilaDePrioridades() {
    
    frente = new NoPrioridade(cauda, null, null);
    frente.setPrioridade(0);
    cauda = new NoPrioridade(null, frente, null);
    cauda.setPrioridade(6);
    tamanho = 0;
    pos = 0;
    array = new NoPrioridade[1];
}

public void enfileirar(Operacao op) {
    
    try{
        
        NoPrioridade novoNo = new NoPrioridade(null, null, op);
        
        if (op.getClass() == Gestante.class) {
            novoNo.setPrioridade(1);
        }
        if (op.getClass() == Idoso.class) {
            novoNo.setPrioridade(2);
        }
        if (op.getClass() == CaixaRapido.class) {
            novoNo.setPrioridade(3);
        }
        if (op.getClass() == CaixaNormal.class) {
            novoNo.setPrioridade(4);
        }
        if (op.getClass() == Furao.class) {
            throw new FuraoException("Furar fila é antiético");
        }

        if (isEmpty()){
            novoNo.setNext(cauda);
            novoNo.setPrev(frente);
            cauda.getPrev().setNext(novoNo);
            cauda.setPrev(novoNo);
            novoNo.setTempoIni(System.currentTimeMillis());
            tamanho++;
        }else{
            NoPrioridade noAux = frente;
            boolean aux = true;
            while (aux){
                if(novoNo.getPrioridade() < noAux.getNext().getPrioridade()){
                    novoNo.setNext(noAux.getNext());
                    novoNo.setPrev(noAux);
                    noAux.setNext(novoNo);
                    noAux.getNext().setPrev(novoNo);
                    novoNo.setTempoIni(System.currentTimeMillis());
                    tamanho++;
                    aux = false;
                }else{
                    noAux = noAux.getNext();
                }
            }    
        }    
    }catch (Exception e) {
        JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE, null);
    }
}

public Operacao desenfileirar() {
    
     try {
            if (isEmpty()) {
                throw new FilaVaziaException("Fila vazia!");
            } else {
                NoPrioridade aux = frente.getNext();
                guardaClientesAtend(aux);
                aux.setTempoFim(System.currentTimeMillis());
                frente.getNext().getNext().setPrev(frente);
                frente.setNext(frente.getNext().getNext());
                tamanho--;
                return aux.getOperacao();  
            }
        } catch (FilaVaziaException e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE, null);
            return null;
        }
     
}

public void controlaTempo(){
    NoPrioridade n = new NoPrioridade(null, null, null);
    System.out.println(n.getTempoIni());
    System.out.println(n.getTempoFim());
}


private void dobrarArray() {
    NoPrioridade[] arrayDobrado = new NoPrioridade[array.length + 1];
    for (int i = 0; i < array.length; i++) {
        arrayDobrado[i] = array[i];
    }
    array = arrayDobrado;
}


public void guardaClientesAtend(NoPrioridade ope){
    if (pos == array.length) {
        dobrarArray();
    }
    array[pos] = ope;
    pos++;
}

public Operacao frente() {

    try {
        return frente.getNext().getOperacao();
    } catch (NullPointerException e) {
        return null;
    }    
}

public Operacao ultimo(){
    try {
        return cauda.getPrev().getOperacao();
    } catch (NullPointerException e) {
        return null;
    }
}

public int size() {
    return tamanho;
}

public boolean isEmpty() {
    return tamanho == 0;
}

public void imprimir() {
    NoPrioridade aux = frente.getNext();
    System.out.println("Fila de Clientes a atender");
    while(aux != cauda){
        System.out.print(aux.getOperacao().getNome()+ " (" + aux.getPrioridade() + "), ");
        aux = aux.getNext();
    }System.out.println();    
}
public void imprimirClientesAtendidos(){
    System.out.println("Clientes que já foram atendidos");
    for (int i = 0; i < array.length; i++) {
        System.out.print(array[i].getOperacao().getNome() + " (" + array[i].getPrioridade() + "), ");
    }System.out.println();
}

}


package trabalho;

public class NoPrioridade {

private NoPrioridade next, prev;
private Operacao operacao;
private int prioridade;
private long tempoIni, tempoFim;

public NoPrioridade(NoPrioridade next, NoPrioridade prev,Operacao operacao){
    this.next = next;
    this.prev = prev;
    this.prioridade = prioridade;
    this.operacao = operacao;

// this.tempoIni = 0;
// this.tempoFim = 0;

}

public NoPrioridade getNext() {
    return next;
}
public void setNext(NoPrioridade next) {
    this.next = next;
}
public NoPrioridade getPrev() {
    return prev;
}
public void setPrev(NoPrioridade prev) {
    this.prev = prev;
}
public Operacao getOperacao() {
    return operacao;
}
public void setOperacao(Operacao operacao) {
    this.operacao = operacao;
}
public int getPrioridade() {
    return prioridade;
}
public void setPrioridade(int prioridade) {
    this.prioridade = prioridade;
}
public long getTempoIni() {
    return tempoIni;
}
public void setTempoIni(long tempoIni) {
    this.tempoIni = tempoIni;
}
public long getTempoFim() {
    return tempoFim;
}
public void setTempoFim(long tempoFim) {
    this.tempoFim = tempoFim;
}

}

Acabei de verificar uma coisa que havia feito errado. No método controlaTempo da classe FilaDePrioridades estou pegando o tempo inicial e final do objeto criado dentro da própria classe, onde eu deveria estar pegando dos objetos que foram enfileirados e instanciados. Estou na dúvida de como pegar os tempos guardados em cada nó.

Cara consegui calcular o tempo que cada cliente permanece na fila. Eu já havia setado o tempo na entrada do nó na fila e na saída do nó da fila. No início estava com dúvida de onde colocar e depois de como recuperar estes dados, depois que vi a sugestão de vocês, a lâmpada apareceu aqui de como eu poderia fazer isso. Muito Obrigado pela ajuda de vocês.