Comunicación y sincronización de hilos

Cómo comunicar y sincronizar hilos que acceden a un recurso común.

Código con los ejemplos del libro

Comunicación y sincronización de hilos

class Contador {
    private int c = 0;
    Contador(int c) {
        this.c = c;
    }

    public void incrementa() {
        c = c + 1;
    }

    public void decrementa() {
        c = c - 1;
    }

    public int getValor() {
        return c;
    }

}// CONTADOR

class HiloA extends Thread {
    private Contador contador;
    public HiloA(String n, Contador c) {
        setName(n);
        contador = c;
    }
    public void run() {
        for (int j = 0; j < 300; j++) {
            contador.incrementa();
            /*try {
                sleep(100);
            } catch (InterruptedException e) {		}*/
        }
        System.out.println(getName() + " contador vale " + contador.getValor());
    }
}// FIN HILO A

class HiloB extends Thread {
    private Contador contador;
    public HiloB(String n, Contador c) {
        setName(n);
        contador = c;
    }
    public void run() {
        for (int j = 0; j < 300; j++) {
            contador.decrementa();
            /*try {
                sleep(100);
            } catch (InterruptedException e) {}*/
        }
        System.out.println(getName() + " contador vale " + contador.getValor());
    }
}// FIN HILO B

public class CompartirInf1 {
    public static void main(String[] args) {
        Contador cont = new Contador(100);
        HiloA a = new HiloA("HiloA", cont);
        HiloB b = new HiloB("HiloB", cont);
        a.start();
        b.start();       
    }
}

Bloques sincronizados

class Contador2 {
    private int c = 0;

    Contador2(int c) {
        this.c = c;
    }

    public void incrementa() {
        c = c + 1;
    }

    public void decrementa() {
        c = c - 1;
    }

    public int getValor() {
        return c;
    }

}// CONTADOR

class HiloA2 extends Thread {
    private Contador2 contador;

    public HiloA2(String n, Contador2 c) {
        setName(n);
        contador = c;
    }

    public void run() {
        synchronized (contador) {
            for (int j = 0; j < 300; j++) {
                contador.incrementa();
                /*try {
                    sleep(100);
                } catch (InterruptedException e) {		}
                */
            }
            System.out.println(getName() + " contador vale "
                    + contador.getValor());
        }

    }
}// HILO A

class HiloB2 extends Thread {
    private Contador2 contador;

    public HiloB2(String n, Contador2 c) {
        setName(n);
        contador = c;
    }

    public void run() {
        synchronized (contador) {
            for (int j = 0; j < 300; j++) {
                contador.decrementa();
                /*try {
                    sleep(100);
                } catch (InterruptedException e) {		}
                */
            }
            System.out.println(getName() + " contador vale "
                    + contador.getValor());
        }
    }
}// HILO B

public class CompartirInf2 {
    public static void main(String[] args) {
        Contador2 cont = new Contador2(100);
        HiloA2 a = new HiloA2("HiloA", cont);
        HiloB2 b = new HiloB2("HiloB", cont);
        a.start();		
        b.start();
        
    }
}

Métodos sincronizados

class Cuenta {
    private int saldo ;
    Cuenta (int s) {saldo = s;}
    
    int getSaldo() {return saldo;}
    void restar(int cantidad){saldo=saldo-cantidad;}
    
    void RetirarDinero(int cant, String nom) {	
        if (getSaldo() >= cant) {
            System.out.println(nom+": SE VA A RETIRAR SALDO (ACTUAL ES: "+getSaldo()+ ")" );
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {	}
            
            restar(cant);	
            
            System.out.println("\t"+nom+ " retira =>"+cant + " ACTUAL("+getSaldo()+")" );	
        } else {
            System.out.println(nom+ " No puede retirar dinero, NO HAY SALDO("+getSaldo()+")" );
        }
        if (getSaldo() < 0) {
            System.out.println("SALDO NEGATIVO => "+getSaldo());
        }		
    }//retirar
}

class SacarDinero extends Thread {
    private Cuenta c;	
    public SacarDinero(String n, Cuenta c) {		
        super(n);
        this.c = c;
    }
    public  void run() {		
        for (int x = 1; x<= 4; x++) {		
            c.RetirarDinero(10, getName());
            try { 
                Thread.sleep(1000); 
            } catch (InterruptedException ex) { }		
        }		
    }// run	
}

public class CompartirInf3 {
    public static void main(String[] args) {
        Cuenta c = new Cuenta(40);
        SacarDinero h1 = new SacarDinero("Ana", c);
        SacarDinero h2 = new SacarDinero("Juan", c);

        h1.start();
        h2.start();
    }
}

synchronized void RetirarDinero(int cant, String nom)

      synchronized void RetirarDinero(int cant, String nom) {
        if (getSaldo() >= cant) {
            System.out.println(nom+": SE VA A RETIRAR SALDO (ACTUAL ES: "+getSaldo()+ ")" );
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {	}
            
            restar(cant);		
            
            System.out.println("\t"+ nom+ " retira =>"+cant + " ACTUAL("+getSaldo()+")" );	
        } else {
            System.out.println(nom+ " No puede retirar dinero, NO HAY SALDO("+getSaldo()+")" );
        }
        if (getSaldo() < 0) {
            System.out.println("SALDO NEGATIVO => "+getSaldo());
        }
        
    }//retirar

Ejercicio 1 de la tarea online

Problema de los filósofos

Una solución gráfica: La cena de los filósofos

Otra solución gráfica: problema de los filósofos

Ejercicio 2 de la tarea online

Bloqueo de hilos

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

wait and notify() Methods in Java

Mostrar de forma alternativa los strings «A B A B . . . »

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