Tiro con arco

CLASE PRINCIPAL

package PaquetePrincipal;

import java.util.concurrent.Semaphore;

/******************************************************************************
 * Clase donde reside el método main() que inicia la aplicación
 *
 * @author IFU
 */


public class Main {

    /**************************************************************************
     * Define los parámetros necesarios para construir hilos tiradores (ver el
     * constructor de la clase Tirador). Se crean los 5 tiradores, y los inicia.
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       
        //número de tiradores. Cada tirador se identifica por un índice del 0 al 4
        //número de arcos de las que disponen los tiradores para disparar
        int tiradores = 5;
        int arcos = 2;

        //Aqui ira el código para declarar un semaforo con los permisos correspondientes
        //a los arcos de los que se disponen.
        Semaphore arco = new Semaphore(arcos,true);
       

       
        //Aqui ira el codigo para iniciar los hilos de los cinco tiradores.
        //Se debe tener en cuenta la forma del constructor tirador.
        for (int c=0;c<tiradores;c++) {
            Tirador tirador = new Tirador(c,arco);
            tirador.start();
        }
       
    }
}

CLASE HILO TIRADORES

package PaquetePrincipal;

import java.util.concurrent.Semaphore;

/*****************************************************************************
 * Hilo tirador. Su método run() realiza un bucle infinito que consite en
 * invocar a los métodos cogerArco, disparar, soltarArco...
 *
 * @author IFU
 */

public class Tirador extends Thread{
   
    //indice del Tirador actual
    private int miIndice;
   
    //referencia al semáforo externo
    private Semaphore semaforoArco;
   
     /****************************************************************************
     * constructor de dos parámetros, cada uno de los cuales se guardará en una
     * variable local para usarla cuando sea neceario
     *
     * @param miIndice índice que identifica al tirador (un entero del 0 al 4)
     * @param semaforoArco semáforo con número de permisos igual al de arcos
     */
    public Tirador(int miIndice, Semaphore semaforoArco){
        this.miIndice= miIndice;
        this.semaforoArco = semaforoArco;
    }
   
     /**************************************************************************
     * bucle infinito: llamada al método cogerArco(),
     * llamada al método disparar(),
     * llamada al método soltarArco()
     */
   
    @Override
    public void run() {

        //Aqui ira el codigo para que el hilo este en un bucle infinito en el que
        //el tirador coge el arco, dispara y suelta el arco.
        while(true) {
            cogerArco();
            disparar();
            soltarArco();
        }

    }
   
     /****************************************************************************
     * método cogerArco(): mostrará un mensaje en la Salida de que el
     * 'Tirador ' N ' quiere disparar', mientras trata de conseguir un
     * Arco para disparar. Una vez conseguida,
     * mostrará un mensaje de que el 'Tirador ' N ' coge un arco'.
     */
    public void cogerArco() {

        System.out.println("Tirador " + (miIndice+1) + " quiere disparar");

        //Aqui ira el codigo para que el hilo intente adquirir el recurso compartido
        //que en esta caso es un arco
        try {
            semaforoArco.acquire(1);
        } catch (InterruptedException iex) {
            System.out.println("Ocurrió un error cuando el tirador " + (miIndice + 1) + " intentaba coger el arco");
        }
       
      
       
        System.out.println("Tirador " + (miIndice+1) + " coge un arco");
    }
   
     /****************************************************************************
     * método disparar(): mostrará un mensaje en la Salida de que el
     * 'Tirador ' N ' disparando'
     * Para simular esta actividad, dormirá el hilo un tiempo aleatorio.
     */
    public void disparar(){
       
        //Aqui ira el codigo para mostrar un mensaje indicando
        //que el tirador número .... está disparando
       

        //Aqui ira el codigo para dormir el hilo un tiempo aleatorio para simular
        System.out.println("Tirador " + (miIndice+1) + " está disparando");
        try {
            sleep(5000);
        } catch (InterruptedException iex) {
            System.out.println("Ocurrió un error cuando el tirador " + (miIndice+1) + " estaba disparando");
        }
       
    
    }
   
     /****************************************************************************
     * método soltarArco(): mostrará un mensaje en la Salida de que el
     * 'Tirador ' N ' ha disparado y Suelta el Arco' y liberá la Arco.
     */
    public void soltarArco(){
        //termina de disparar
        System.out.println("Tirador " + (miIndice+1) + " ha disparado. Suelta un arco.");
       
        //Aqui ira el codigo para liberar el recurso compartido, es decir el arco
        semaforoArco.release(1);
       
    }
}