Criar placar para corrida feita com multithread

Classe Corrida:
public class Corrida {

public static final int QNTD_SAPOS = 5;
public static final int DISTANCIA_TOTAL = 500;

public static void main(String[] args) {
	
	Sapo[] sapos = new Sapo[QNTD_SAPOS];
	
	for (int i = 0; i < sapos.length; i++) {
		sapos[i] = new Sapo("Sapo_" + (i+1), DISTANCIA_TOTAL);
		sapos[i].start();
	}
}

}

Classe Sapo:
private static final int MAXIMO_DESCANSO = 500;
private static final int MAXIMO_PULO = 50;

private static Object monitor = new Object();

private String nome;
private int distanciaTotal;
private int distanciaPercorrida;
private int ultimoPulo;
private static int colocacao;

public Sapo(String nome, int distanciaTotal) {
	this.nome = nome;
	this.distanciaTotal = distanciaTotal;
}

private void pular() {
	
	ultimoPulo = (int) (Math.random() * MAXIMO_PULO);
	distanciaPercorrida += ultimoPulo;
	
	if(distanciaPercorrida > distanciaTotal) {
		distanciaPercorrida = distanciaTotal;
	}
}

private void avisarSituacao() {
	System.out.println(nome + " pulou " + ultimoPulo + " cm. A distância percorrida foi de "
		+ distanciaPercorrida + "cm!");
}

private void cruzarLinhaDeChegada() {
	synchronized (monitor) {
		colocacao++;
		System.out.println("=> " + nome + " cruzou a linha de chegada em " 
			+ colocacao + "º lugar!");
	}
}

private void descansar() {
	int tempo = (int) (Math.random() * MAXIMO_DESCANSO);
	try {
		Thread.sleep(tempo);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

@Override
public void run() {
	while (distanciaPercorrida < distanciaTotal) {
		pular();
		avisarSituacao();
		descansar();
	}
	cruzarLinhaDeChegada();
}

O resultado na tela é sempre “SAPO_X + DISTÂNCIA_PULO. DISTANCIA_PERCORRIDA” até dar 500 e o sapo cruzar a linha de chegada. Quando isso acontece, o console imprime SAPO_X cruzou a linha de chegada em POSICAO lugar!

=> Quero criar um PLACAR para mostrar no FIM da execução o seguinte:
SAPO_X em POSICAO lugar!
SAPO_Y em POSICAO lugar!
SAPO_Z em POSICAO lugar!

Boa tarde, você pode usar um ArrayList que é uma implementação da interface List, então adicionar cada um dos objetos dentro dela, ela armazena na ordem que é incluido, ou pode criar um Array do objeto e incluir ele usando no elemento a posição de chagada de cada um.

Exemplo:

List<TipoDeObjeto> listaVencedores = new ArrayList<>();

Quando primeiro chegar, então faz:

listVencedores.add(Objeto);

Ou

TipoDeObjeto[] listaVencedores = new TipoDeObjeto[TAMANHO];

Quando primeiro chegar, então faz:

listaVencedores[posição] = Objeto;

Então no final de toda interação, só imprimir. Espero ter ajudado, abraço!

Eu criaria um objeto Corrida a parte para controlar as corridas e os sapos.
Gostei da ideia de corridas e resolvi baixar o codigo e mexer :slight_smile:

Segue ai o repositório com essa implementação que você falou: