Ejemplos de 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
Recursos del capítulo 2: Programación multihilo
CompartirInf1.java
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
CompartirInf2.java
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
CompartirInf3.java
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();
}
}
CompartirInf4.java
synchronized void RetirarDinero(int cant, String nom)
class Cuenta2 {
private int saldo ;
Cuenta2 (int s) { saldo = s; }
int getSaldo() { return saldo; }
void restar(int cantidad) { saldo=saldo-cantidad; }
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
}
class SacarDinero2 extends Thread {
private Cuenta2 c;
String nom;
public SacarDinero2(String n, Cuenta2 c) {
super(n);
this.c = c;
}
public void run() {
for (int x = 1; x<= 4; x++) {
c.RetirarDinero(10, getName());
}
}// run
}
public class CompartirInf4 {
public static void main(String[] fer) {
Cuenta2 c = new Cuenta2(40);
SacarDinero2 h1 = new SacarDinero2("Ana", c);
SacarDinero2 h2 = new SacarDinero2("Juan", c);
h1.start();
h2.start();
}
}
Ejercicio 3 de la tarea online

Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.