Comunicación entre hilos

Cómo comunicar hilos

Comunicación entre hilos (punto 6.3.4)

 

Estructura típica:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
synchronized method(...) {
while (!condicion()) {
wait();
}
// Tareas a realizar
notify();
//notifyAll();
}
synchronized method(...) { while (!condicion()) { wait(); } // Tareas a realizar notify(); //notifyAll(); }
synchronized method(...) {
    while (!condicion()) {
        wait();
    }
    // Tareas a realizar


   notify();
   //notifyAll();
}

Los métodos wait() y notify()

Ejemplo: Sender and Receiver

Código en GitHub

 

Ejemplo: Crear 2 hilos, cada uno de ellos mostrará una letra

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class ObjetoCompartido {
public void PintaCadena (String s) {
System.out.print(s);
}
}// ObjetoCompartido
class HiloCadena extends Thread {
private ObjetoCompartido objeto;
String cad;
public HiloCadena (ObjetoCompartido c, String s) {
this.objeto = c;
this.cad=s;
}
public void run() {
for (int j = 0; j < 10; j++) {
objeto.PintaCadena(cad);
}//for
}//run
}//HiloCadena
public class BloqueoHilos {
public static void main(String[] args) {
ObjetoCompartido com = new ObjetoCompartido();
HiloCadena a = new HiloCadena (com, " A ");
HiloCadena b = new HiloCadena (com, " B ");
a.start();
b.start();
}
}//BloqueoHilos
class ObjetoCompartido { public void PintaCadena (String s) { System.out.print(s); } }// ObjetoCompartido class HiloCadena extends Thread { private ObjetoCompartido objeto; String cad; public HiloCadena (ObjetoCompartido c, String s) { this.objeto = c; this.cad=s; } public void run() { for (int j = 0; j < 10; j++) { objeto.PintaCadena(cad); }//for }//run }//HiloCadena public class BloqueoHilos { public static void main(String[] args) { ObjetoCompartido com = new ObjetoCompartido(); HiloCadena a = new HiloCadena (com, " A "); HiloCadena b = new HiloCadena (com, " B "); a.start(); b.start(); } }//BloqueoHilos
class ObjetoCompartido {	
    public void PintaCadena (String s) {
        System.out.print(s);
    }
  }// ObjetoCompartido

class HiloCadena extends Thread {
    private ObjetoCompartido objeto;
    String cad;
    public HiloCadena (ObjetoCompartido c, String s) {		
        this.objeto = c;
        this.cad=s;
    }
    public void run() {
             for (int j = 0; j < 10; j++) {				
                 objeto.PintaCadena(cad);		
             }//for 
        }//run

}//HiloCadena

public class BloqueoHilos {
    public static void main(String[] args) {
        ObjetoCompartido com = new ObjetoCompartido();
        HiloCadena  a = new HiloCadena (com, " A ");
        HiloCadena  b = new HiloCadena (com, " B ");
        a.start();
        b.start();
    }
}//BloqueoHilos

Mostrar de forma alternativa la letra de cada hilo: «A B A B . . . »

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class ObjetoCompartido {
public void PintaCadena (String s) {
System.out.print(s);
}
}// ObjetoCompartido
class HiloCadena extends Thread {
private ObjetoCompartido objeto;
String cad;
public HiloCadena (ObjetoCompartido c, String s) {
this.objeto = c;
this.cad=s;
}
public void run() {
synchronized (objeto) {
for (int j = 0; j < 10; j++) {
objeto.PintaCadena(cad);
objeto.notify(); //aviso que ya he usado el objeto
try {
objeto.wait();//esperar a que llegue un notify
} catch (InterruptedException e) {
e.printStackTrace();
}
}//for
objeto.notifyAll(); //despertar a todos los wait sobre el objeto
}//fin bloque synchronized
System.out.print("\n"+cad + " finalizado");
}//run
}//HiloCadena
public class BloqueoHilos {
public static void main(String[] args) {
ObjetoCompartido com = new ObjetoCompartido();
HiloCadena a = new HiloCadena (com, " A ");
HiloCadena b = new HiloCadena (com, " B ");
a.start();
b.start();
}
}//BloqueoHilos
class ObjetoCompartido { public void PintaCadena (String s) { System.out.print(s); } }// ObjetoCompartido class HiloCadena extends Thread { private ObjetoCompartido objeto; String cad; public HiloCadena (ObjetoCompartido c, String s) { this.objeto = c; this.cad=s; } public void run() { synchronized (objeto) { for (int j = 0; j < 10; j++) { objeto.PintaCadena(cad); objeto.notify(); //aviso que ya he usado el objeto try { objeto.wait();//esperar a que llegue un notify } catch (InterruptedException e) { e.printStackTrace(); } }//for objeto.notifyAll(); //despertar a todos los wait sobre el objeto }//fin bloque synchronized System.out.print("\n"+cad + " finalizado"); }//run }//HiloCadena public class BloqueoHilos { public static void main(String[] args) { ObjetoCompartido com = new ObjetoCompartido(); HiloCadena a = new HiloCadena (com, " A "); HiloCadena b = new HiloCadena (com, " B "); a.start(); b.start(); } }//BloqueoHilos
class ObjetoCompartido {	
    public void PintaCadena (String s) {
        System.out.print(s);
    }
  }// ObjetoCompartido

class HiloCadena extends Thread {
    private ObjetoCompartido objeto;
    String cad;
    public HiloCadena (ObjetoCompartido c, String s) {		
        this.objeto = c;
        this.cad=s;
    }
    public void run() {
          synchronized (objeto) {
             for (int j = 0; j < 10; j++) {				
                 objeto.PintaCadena(cad);
                 objeto.notify(); //aviso que ya he usado el objeto
                 try {
                    objeto.wait();//esperar a que llegue un notify 
                 } catch (InterruptedException e) {
                    e.printStackTrace();
                 }			
             }//for 
             objeto.notifyAll(); //despertar a todos los wait sobre el objeto
          }//fin bloque synchronized

          System.out.print("\n"+cad + " finalizado");
        }//run

}//HiloCadena

public class BloqueoHilos {
    public static void main(String[] args) {
        ObjetoCompartido com = new ObjetoCompartido();
        HiloCadena  a = new HiloCadena (com, " A ");
        HiloCadena  b = new HiloCadena (com, " B ");
        a.start();
        b.start();
    }
}//BloqueoHilos

Deja una respuesta