1. Criba de Eratóstenes Escribir dato() CONSUMIDOR Escribir dato() NUMEROS FILTRO FILTRO Escribir dato() DATO DATO DATO Número Número Número ……….. Tratar() GeneraNumero() Tratar() Tratar() SALIDA
2. Código Generador de Numeros: public class Numeros extends Thread{ intinicial = 2; int_final; SuperTipo_filtro; publicNumeros(SuperTipo filtro, int ultimo){ _filtro = filtro; _final = ultimo; } publicvoidgenerarNumero(){ _filtro.escribirDato(inicial++); } publicvoidrun(){ for(int i = 2; i<=_final; i++){ generarNumero(); } } }
3. Código Generador de Numeros: public class Numeros extends Thread{ intinicial = 2; int_final; SuperTipo_filtro; publicNumeros(SuperTipo filtro, int ultimo){ _filtro = filtro; _final = ultimo; } publicvoidgenerarNumero(){ _filtro.escribirDato(inicial++); } publicvoidrun(){ for(int i = 2; i<=_final; i++){ generarNumero(); } } } Envía un numero al primer filtro
4. Código de Supertipo: Como Filtro y Consumidor se comportan de manera parecida, ambos extienden la siguiente clase: public abstract class SuperTipo extends Thread { int_dato; boolean_flag = false; public synchronized void escribirDato(intdato){ while(_flag) try{wait();}catch(InterruptedExceptionexc){;} _dato = dato; _flag = true; notify();//Solo puede haber un filtro esperando datos en el WS } abstractvoid tratar(); publicvoidrun(){ while(true){//Se nos va a producir una situacion de interbloqueo //ya que los filtros se quedan esperando numeros. tratar(); } } }
5. Código de Supertipo: Como Filtro y Consumidor se comportan de manera parecida, ambos extienden la siguiente clase: public abstract class SuperTipo extends Thread { int_dato; boolean_flag = false; public synchronized void escribirDato(intdato){ while(_flag) try{wait();}catch(InterruptedExceptionexc){;} _dato = dato; _flag = true; notify();//Solo puede haber un filtro esperando datos en el WS } abstractvoid tratar(); publicvoidrun(){ while(true){//Se nos va a producir una situacion de interbloqueo //ya que los filtros se quedan esperando numeros. tratar(); } } } Recibe un dato de otro elemento del programa. Trata el elemento almacenado
6. Código de Filtro public class Filtro extends SuperTipo{ int_primo = -1; SuperTipo_trabajador; Salida _salida; publicFiltro(SuperTipo trabajador, Salida salida){ super(); _trabajador = trabajador; _salida = salida; } publicsynchronizedvoid tratar(){ while(!_flag) try{wait();}catch(InterruptedExceptionexc){;} if(_primo == -1) {//Si es el primero _primo = _dato; _salida.mostrar(_dato); } else{//No es el primero if((_dato%_primo)!=0)//No es divisible por el 1er numero _trabajador.escribirDato(_dato); } _flag = false; notify();//Solo puede estar en el este WS el filtro anterior, esperando para escribir } }
7. Código de Filtro public class Filtro extends SuperTipo{ int_primo = -1; SuperTipo_trabajador; Salida _salida; publicFiltro(SuperTipo trabajador, Salida salida){ super(); _trabajador = trabajador; _salida = salida; } publicsynchronizedvoid tratar(){ while(!_flag) try{wait();}catch(InterruptedExceptionexc){;} if(_primo == -1) {//Si es el primero _primo = _dato; _salida.mostrar(_dato); } else{//No es el primero if((_dato%_primo)!=0)//No es divisible por el 1er numero _trabajador.escribirDato(_dato); } _flag = false; notify();//Solo puede estar en el este WS el filtro anterior, esperando para escribir } } Contiene un dato, un método para pasárselo y el método run. Mientras no hay dato: ESPERA Si el dato es el primero en llegar: es primo y lo guardamos y mostramos El dato NO es divisible por nuestro nº primo: Lo pasamos al siguiente filtro
8. Código Consumidor A la instancia de esta clase llegaran números cuando todos los filtros hayan calculado los primos. (Llegan los que no se han podido comprobar si son primos por que no hay suficientes filtros) publicclass Consumidor extendsSuperTipo{ publicsynchronizedvoid tratar(){ while(!_flag) try{wait();}catch(InterruptedExceptionexc){;} System.out.println("Posible candidato: " + _dato ); _flag = false; notify(); } }
9. Código Consumidor A la instancia de esta clase llegaran números cuando todos los filtros hayan calculado los primos. (Llegan los que no se han podido comprobar si son primos por que no hay suficientes filtros) Contiene un dato, un método para pasárselo y el método run. publicclass Consumidor extendsSuperTipo{ publicsynchronizedvoid tratar(){ while(!_flag) try{wait();}catch(InterruptedExceptionexc){;} System.out.println("Posible candidato: " + _dato ); _flag = false; notify(); } } Si tiene un dato, lo muestra por pantalla.
10. CodigoMain publicclass Principal { //Constantes para el numero de filtros y numeros a generar. static private final intNUMFILTROS = 15; static private final intULTIMO = 100; public static void main(String[] args) { SuperTipomyConsumidor = new Consumidor(); Salida mySalida = new Salida(); SuperTipovectorFiltros[] = new Filtro[NUMFILTROS]; vectorFiltros[NUMFILTROS-1] = new Filtro(myConsumidor,mySalida); for(inti=NUMFILTROS-2; i>= 0; i--) vectorFiltros[i] = new Filtro(vectorFiltros[i+1],mySalida); NumerosmyNumeros = new Numeros(vectorFiltros[0],ULTIMO); myNumeros.start(); myConsumidor.start(); for(inti=0; i < NUMFILTROS; i++) vectorFiltros[i].start(); } }
11. CodigoMain publicclass Principal { //Constantes para el numero de filtros y numeros a generar. static private final intNUMFILTROS = 15; static private final intULTIMO = 100; public static void main(String[] args) { Salida mySalida = new Salida(); SuperTipomyConsumidor = new Consumidor(); SuperTipovectorFiltros[] = new Filtro[NUMFILTROS]; vectorFiltros[NUMFILTROS-1] = new Filtro(myConsumidor,mySalida); for(inti=NUMFILTROS-2; i>= 0; i--) vectorFiltros[i] = new Filtro(vectorFiltros[i+1],mySalida); NumerosmyNumeros = new Numeros(vectorFiltros[0],ULTIMO); myNumeros.start(); myConsumidor.start(); for(inti=0; i < NUMFILTROS; i++) vectorFiltros[i].start(); } } Creamos el consumidor, los filtros (pasándole a cada uno el siguiente[al ultimo se le pasa el consumidor]) y el generador de números, pasándole el 1er filtro. Ejecutamos los filtros, el consumidor y el generador de números.