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);
}
}