Este código genera números de manera concurrente y los filtra para identificar números primos mediante un patrón de filtro de cadena. Crea un generador de números, un consumidor y una cadena de filtros que se pasan los números de forma asíncrona para determinar si son primos o no.
Función: estructura de una función, nombre de una función, resultados de una función, llamada a una función, prototipos de funciones, parámetros de una función, paso de parámetros por valor, parámetros const de una función, ámbito alcance, ámbito de programa, ámbito de bloque, variables locales, visibilidad de una función.
Función: estructura de una función, nombre de una función, resultados de una función, llamada a una función, prototipos de funciones, parámetros de una función, paso de parámetros por valor, parámetros const de una función, ámbito alcance, ámbito de programa, ámbito de bloque, variables locales, visibilidad de una función.
Introducción a la aplicación
Empezaremos a usar las herramientas internas de este programa, como el filtrado de datos y ordenaciones.Y ya en esta lección se empezarán a escribir, a nivel muy simple, los primeros scripts de Sql.
Para visualizar y descargar materiales, visite mi blog:
https://conestecurso.wordpress.com
Introducción a la aplicación
Empezaremos a usar las herramientas internas de este programa, como el filtrado de datos y ordenaciones.Y ya en esta lección se empezarán a escribir, a nivel muy simple, los primeros scripts de Sql.
Para visualizar y descargar materiales, visite mi blog:
https://conestecurso.wordpress.com
Kent Beck dice “No sé si soy un gran programador, pero definitivamente son un programador con grandes prácticas”. ¿Cuáles son estas grandes prácticas? Test Drive Development y Clean Code son dos de ellas. La adopción de estas prácticas nos ayuda como programadores para que perdamos el miedo a usar código nuevo y confiemos en nuestros compañeros de equipo. También ayuda a reducir la tan odiada documentación o peor, tener documentación incorrecta (como comentarios obsoletos) . Esta presentación incluye una demostración de TDD en Java.
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.