/*
 * Cinco lebres disputar‹o uma corrida. Cada lebre pode dar um salto que varia 
 * de 1 a 3 metros de dist‰ncia. A distancia percorrida ˇ de 20 metros. Na 
 * corrida, cada lebre dar‡ um salto, informar quantos metros ela pulou a 
 * cada salto realizado. Em seguida, a lebre p‡ra para descansar 
 * (yield()). Escreva um programa, utilizando threads (uma para cada lebre), 
 * que informe a lebre vencedora e a coloca¨‹o de cada uma delas no final 
 * da corrida. Informar tambˇm quantos pulos cada uma delas deu.
 */

import java.util.AbstractCollection;
import java.util.concurrent.ArrayBlockingQueue;


class Lebre extends Thread {
	
	private int distancia = 20;
	private int distanciaPercorrida = 0;
	private AbstractCollection<String> resultado;
	
	public Lebre (AbstractCollection<String> resultado) {
		this.resultado = resultado;
	}
	
	public void run() {
		while (distanciaPercorrida < distancia) {
			int s = salto();
			distanciaPercorrida += s;
			System.out.println(getName() + " saltou " + s);
			yield();
		}
		resultado.add(getName());
	}
	
	public int salto() {
		return (int) (1+Math.random()*3);
	}
	
}

public class CorridaLebres {
	
	static AbstractCollection<String> resultado = new ArrayBlockingQueue<String>(3);
	
	public static void main(String args[]) {
		System.out.println("Come¨ando a corrida...");
		
		Lebre l1 = new Lebre(resultado);
		Lebre l2 = new Lebre(resultado);
		Lebre l3 = new Lebre(resultado);
		
		l1.start();
		l2.start();
		l3.start();
		try {
			l1.join();
			l2.join();
			l3.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("\nResultado Final: ");
		for (String lebre : resultado) {
			System.out.println(lebre);
		}
	}
	
}

