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
public class Contenedor implements Runnable {
private Banco bank;
public Contenedor(Banco bank) {
this.bank = bank;
}
@Override
public void run() {
while(Boolean.TRUE)
{
bank.retirarDinero(20);
bank.depositarDinero(30);
bank.retirarDinero(20);
bank.retirarDinero(20);
}
}
public static void main(String[] args) {
Banco bank=new Banco();
Thread hilo1=new Thread(new Contenedor(bank));
Thread hilo2=new Thread(new Contenedor(bank));
Thread hilo3=new Thread(new Contenedor(bank));
hilo1.start();
hilo2.start();
hilo3.start();
}
}
|

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);
}
}
|

Gracias a todos por leer…
