Hola comunidad Steemit, hoy seguiremos hablando sobre hilos y multi-hilos en java, para aprender algunos conceptos y analizar cómo funciona les invito a revisar el anterior post Post hilos en Java
Codigo Ejemplo
Creamos la Clase Banco en ella definimos 1 atributo que llamaremos saldo de tipo int.
Luego creamos 3 métodos sincronizados (synchronized) lo cuales llamaremos :
retirarDinero(int retiro)
depositarDinero(int deposito)
getSaldo()
public class Banco {
private int saldo;
public synchronized void retirarDinero(int retiro){
if( getSaldo()>=retiro){
this.saldo=this.saldo-retiro;
System.out.println("retiraste "+retiro);
System.out.println("el saldo" +getSaldo());
}else{
System.out.println("saldo insuficiente al intentar retirar "+retiro);
}
}
public synchronized void depositarDinero(int deposito){
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.saldo=this.saldo+deposito;
System.out.println("depositaste "+deposito);
System.out.println("luego de depositar el saldo" +getSaldo());
}
public synchronized int getSaldo() {
return saldo;
}
}
Luego creamos la clase Contenedor y definido en ella el método principal main se genera una instancia de la Clase Banco, y finalmente, se invoca el método run() sobre la instancia de las Clase Banco
Aquí tenemos otro ejemplo con hilos y el uso de monitores en java
Creamos la Clase Cañón en ella definimos 2 atributos los llamaremos bala de tipo int y para el monitor un atributo llamado preparado de tipo boolean.
Luego creamos 2 métodos sincronizados (synchronized) lo cuales llamaremos :
dispararBala()
cargarCañon (int bala)
public class Cañon {
public int bala;
boolean preparado=false;
public synchronized int dispararBala(){
if(!this.preparado){
try{
wait();
}catch (InterruptedException e) {
System.out.println("error interrumpido "+e);
}
}
this.preparado=false;
System.out.println("disparando cañon bala numero "+bala);
notify();
return bala;
}
public synchronized void cargarCañon (int bala){
if(this.preparado){
try{
wait();
}catch (Exception e) {
System.out.println("error interrumpido "+e);
}
}
System.out.println("cargando el cañon bala numero "+bala);
this.bala=bala;
this.preparado=true;
notify();
}
}
public class Cargar implements Runnable{
private Cañon cañon;
public Cargar(Cañon cañon) {
this.cañon=cañon;
new Thread(this,"disparando ").start();
}
@Override
public void run() {
int bala=1;
while(true){
cañon.cargarCañon(bala++);
}
}
}
public class Disparar implements Runnable {
private Cañon cañon;
public Disparar(Cañon cañon) {
this.cañon=cañon;
new Thread(this,"disparar ").start();
}
@Override
public void run() {
while(true){
cañon.dispararBala();
}
}
}
public class CampoTiros {
public static void main(String[] args) {
Cañon cañon=new Cañon();
new Disparar(cañon);
new Cargar(cañon);
}
}