You are on page 1of 4

Pr

actica semanal 5
B
usqueda Interrumpida
Autor: Jose Manuel Luque Gonzalez
Dise
no de sistemas concurrentes y distribuidos

1.

Enunciado

Se pide implementar un programa que busque un elemento determinado en una matriz,


basandose en una b
usqueda concurrente. Para esto se dividira la b
usqueda por filas,
siendo una hebra la responsable de buscar en cada fila.

2.

Clase BuscadorFila

Esta clase implementara una interfaz Runnable, siendo pues ejecutada por una hebra
cada una de sus instancias. A cada hebra se le pasa una fila de la matriz (se ha decidido
que el Main sea el encargado de pasar cada fila a cada hebra y no la matriz entera y un
n
umero de fila). Buscando posteriormente el elemento a buscar (el cual ha recibido por
tambien al construirse) y por ultimo se le pasa el n
umero de la fila que tiene respecto a
la matriz principal para poder devolverlo en caso de encontrar el elemento.
El funcionamiento puede dividirse en 2 partes, tal y como sigue.

2.1.

Bucle principal

Este bucle, el cual tiene como cabecera:

while (i<miFila.length && !Encontrado && !Thread.currentThread().isInterrupted())


Se encargara de ir buscando el elemento mientras no te excedas del tama
no de la matriz,
no lo hayas encontrado y no te interrumpan. Durante el bucle si se encuentra el elemento,
se ejecutara el codigo que sigue, cuyo objetivo es abrir un semaforo en el main el cual hace
que el main proceda a interrumpir cada una de las hebras que aun queden, dicho semaforo
requiere NumFilas de huecos para pasar, esto se explicara en el apartado siguiente.
Ademas se cerrara otro semaforo para que si mientras una ya lo ha encontrado y se
dispone a informar hay otra que lo encuentra.
if (miFila[i]==comodin)
{
Encontrado=true;
try
{
Main.mutexEncontrada.acquire();
} catch (InterruptedException e)
{

// TODO Auto-generated catch block


return;
}
Main.ColumnaEncontrado=i;
Main.FilaEncontrado=NumeroFila;
System.out.println(Arrays.toString(miFila));
System.out.println("Se encontro en la fila "+ NumeroFila);
Main.SemaphoroInterrumpir.release(Main.NumeroDeFilas); //Se liberan NumeroDeFi
}

2.2.

Caso de no encontrar el elemento

Si no se encuentra el elemento deseado se dara paso a un elemento en el semaforo


del main el cual es el encargado de terminar con las hebras, por si en ninguna de las
hebras se encuentra el elemento el main podra continuar de igual forma, solo que como
vera que no se ha encontrado nada (gracias a que el main sabe en que fila y columna
esta el elemento). Por lo tanto no procedera a interrumpir las hebras, pues en ese caso
ya habran acabado todas.
if(!Encontrado)
{
Main.SemaphoroInterrumpir.release();
}

3.

Main

La clase Main inicialmente tendra la puesta en marcha del sistema, el cual no es de


interes. Posteriormente se quedara bloqueada en el semaforo anteriormente comentado.
SemaphoroInterrumpir.acquire(NumeroDeFilas);
Esto lo hara tras ejecutar todas las hebras, pasando este semaforo unicamente si todas
las hebras acabaron o si una de ellas encontro el elemento. Tras esto se mirara si se
encontro el elemento, procediendose a interrumpir el resto de hebras o si no se encontro,
en cuyo caso ya todas acabaron.

if (ColumnaEncontrado==-1)
{
System.out.println("No se encontr
o el elemento");
}
else
{
System.out.println("Ya se que se encontro en la fila "+ FilaEncontrado + " co
for (int i = 0; i <NumeroDeFilas; i++)
{
ArrayHebrasBuscadoras[i].interrupt();
}
}

4.

Resultados

Es difcil que se quede una situacion de interrupcion de hebras si el tama


no de las filas
/ columnas es reducido, debido a que terminan todas antes de empezar a interrumpirse,
sin embargo se han hecho varias pruebas con tama
nos grandes y se logra ver como se
sale del bucle para posteriormente acabar si es interrumpida por el main

Figura 1: Captura de consola