Para realizar esto, usaremos los monitores de Java, los métodos wait()
y notify()
. Estos métodos tienen que ir siempre incluidos sobre métodos marcados como syncronized o usar el método syncronized(metodo sincronizado). wait()
y notify()
(hay alguno más) heredan del Object
, por lo que todos los objetos que hereden de esta clase, lo tienen disponible.
¿Que hace wait()
? suspende indefinidamente el hilo hasta que se reanude con notify()
.
Así que crearé una clase que solicitará la descomposición del número, el cual es enviado al supuesto servidor compartido de descomposiciones factoriales, este se encarga de descomponerlo (tarea dura) y una vez que termine, habrá un receptor de datos esperando a su finalización para mostrar su descomposición.
La clase SolicitudDescomposicion
y VisualizadorDescomposicion
heredan de Thread
, los iniciamos desde la clase principal y a trabajar por parte del servidor. He aquí el código:
public static void main(String[] args) { // TODO code application logic here ServidorDescomposicion r=new ServidorDescomposicion(); for (int i = 0; i < 10; i++) { SolicitudDescomposicion productor=new SolicitudDescomposicion(i, r); VisualizadorDescomposicion consumidor=new VisualizadorDescomposicion(i, r); productor.start(); consumidor.start(); } } public class SolicitudDescomposicion extends Thread { ServidorDescomposicion r; public SolicitudDescomposicion(int n, ServidorDescomposicion _r){ this.setName("Productor " + n); r=_r; } @Override public void run(){ int n=Math.abs(new Random().nextInt()); System.out.println("Enviando número descomposición desde el productor:\t" + n); r.descomponerNumero(n); } } public class VisualizadorDescomposicion extends Thread{ ServidorDescomposicion r; public VisualizadorDescomposicion(int n, ServidorDescomposicion _r){ this.setName("Consumidor " + n); r=_r; } @Override public void run(){ String desc=""; try { desc = r.getDescomposicion(); } catch (InterruptedException ex) { Logger.getLogger(VisualizadorDescomposicion.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Datos obtenidos desde el consumidor.Resultado:\t\t" + desc); } } public class ServidorDescomposicion { ArrayList buffer; boolean existData; //&& estado.equals(estadoEnum.DESCOMPONIENDO //&& estado.equals(estadoEnum.LIBRE) public ServidorDescomposicion() { buffer = new ArrayList(); } public synchronized void descomponerNumero(int numero) { descomponer(numero); } void retardo(int ms) { try { Thread.sleep(ms); } catch (InterruptedException ex) { Logger.getLogger(ServidorDescomposicion.class.getName()).log(Level.SEVERE, null, ex); } } public synchronized String getDescomposicion() throws InterruptedException { while(!existData){ try { wait(); } catch (InterruptedException ex) { Logger.getLogger(ServidorDescomposicion.class.getName()).log(Level.SEVERE, null, ex); } } String descomposicion = ""; descomposicion = buffer.remove(0); if (buffer.size()==0) { existData=false; } notify(); return descomposicion; } void descomponer(int numero) { // Cálculos y resultados int iniNum = numero; int numeroAux = numero; int n = 0; int nn = 0; String text = ""; String puntos = "."; for (long i = 2; i < numero; i++) { while (numeroAux % i == 0) { numeroAux /= i; text += i + "."; if (numeroAux == 1) { numero = numeroAux; } } } if (text.isEmpty()) { System.out.printf("El número %s es primo!\n", iniNum); text = String.valueOf(iniNum); } buffer.add(String.format("%s=%s", iniNum, text)); existData=true; } }
y el resultado para 10 números enteros
Enviando número descomposición desde el productor: 1007666687
Enviando número descomposición desde el productor: 233955388
Enviando número descomposición desde el productor: 403028651
Enviando número descomposición desde el productor: 1405658987
Enviando número descomposición desde el productor: 809322159
Enviando número descomposición desde el productor: 263332588
Enviando número descomposición desde el productor: 1552584352
Enviando número descomposición desde el productor: 1342709543
Datos obtenidos desde el consumidor.Resultado: 1007666687=17.31.43.53.839.
Datos obtenidos desde el consumidor.Resultado: 1342709543=7.191815649.
Datos obtenidos desde el consumidor.Resultado: 1552584352=2.2.2.2.2.11.89.49559.
Datos obtenidos desde el consumidor.Resultado: 263332588=2.2.487.135181.
Datos obtenidos desde el consumidor.Resultado: 809322159=3.113.733.3257.
Datos obtenidos desde el consumidor.Resultado: 403028651=67.6015353.
Datos obtenidos desde el consumidor.Resultado: 233955388=2.2.31.443.4259.
Datos obtenidos desde el consumidor.Resultado: 1405658987=127.199.55619.
Saludos