Viruz Blog
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Uso de clase Thread parte 2

Ir abajo

Uso de clase Thread parte 2 Empty Uso de clase Thread parte 2

Mensaje  Admin (Viruz) Sáb Dic 22, 2012 9:50 am

Siguiendo con el tema de Threads en la primera parte se aprendió sobre el método que le da inicio a un hilo start() así como la sincronización de un método (synchronized) y el método abstracto al implementar la interfaz Runnable run().

Hoy conoceremos otro programa en el cual se verán los siguientes puntos:

  • El uso del método charAt().
  • El método wait(): Deja bloqueado el hilo que lo llama.
  • El método notify(): Desbloquea o activa con una notificación el hilo que se bloquea con el método wait().
  • Sincronización de métodos (set y get) que en el caso de ejemplo serán (depositar y retirar).
  • Como crear un hilo heredando de la clase Thread.
Lo que se necesita conocer
  • Uso de clase Threads (Parte 1)
¿Como funciona el Programa?

  1. En esta ocasión empezaré por la clase Deposito el cual se observa que hereda de Thread es otra forma de crear un hilo y en su método run() se realiza un ciclo for() donde se harán 10 depósitos.
  2. Dentro de este ciclo se ocupará el método charAt() que se encarga de escoger una letra al azar con Math.ramdom() de una cadena de String declarada anteriormente. Y posteriormente se realiza un deposito de esta letra.
  3. Caso contrario en la clase Retiro dentro del método run() se realiza otro ciclo for() donde solo se llamará al método retirar() el cual es un método get() por lo que nos devolverá el carácter antes depositado.
  4. En la clase Operacion primeramente sincronizamos los métodos mencionados anteriormente y mediante una bandera y un ciclo while() se indicará que primero se deposita antes de retirar.
  5. Por último si se realiza un depósito o retiro se usará el método wait() el cual pausará para no volver hacer la operación nuevamente y notify() para poder activarlo de nuevo cuando este se desocupe.
Imágenes
[Tienes que estar registrado y conectado para ver esa imagen]

Código

Clase Deposito
/**
*
* @author Jesus Ivan
*/
public class Deposito extends Thread {
private Operacion operacion;
private final String letras ="abcdefghijklmnñopqrstuvxyz";

public Deposito(Operacion operacion) {
this.operacion = operacion;
}

@Override
public void run() {
for (int i=0; i<10; i++) {
//charAt devuelve el carácter que está situado en la posición indicada.
//Extrae un caracter de un String. charAt es de la clase String.
char c=letras.charAt((int)(Math.random()* letras.length()));
System.out.println(i +" Depósito: "+ c);

operacion.depositar(c);
try {
sleep(400);
} catch (InterruptedException e) {}
}
}
}

Clase Retiro
/**
*
* @author Jesus Ivan
*/
public class Retiro extends Thread {
private Operacion operacion;

public Retiro(Operacion operacion) {
this.operacion = operacion;
}

@Override
public void run() {
char valor;
for (int i=0; i<10; i++) {
valor = operacion.retirar();
System.out.println(" Retiro "+i+ ": "+ valor);
try {
sleep(100);
} catch (InterruptedException e) {}
}
}
}

Clase Operacion

/**
*
* @author Jesus Ivan
*/
public class Operacion {
private char contenido;
private boolean disponible = false;

public Operacion() {
}

public synchronized char retirar() {
//Mientras disponible tenga un parametro negrativo ! osea este en falso.
while (!disponible) {
try {
wait();
} catch (InterruptedException e) {}
}
disponible=false;
notify();
return contenido;
}

public synchronized void depositar(char valor) {
//Mientras el valor disponible se encuentre en estado verdadero.
while (disponible) {
try {
wait();
} catch (InterruptedException e) {}
}
contenido = valor;
disponible = true;
notify();
}
}


Clase Main
/**
*
* @author Jesus Ivan
*/
public class Main {
public static void main(String [] args) {
Operacion b = new Operacion();
Deposito p = new Deposito(b);
Retiro c = new Retiro(b);
p.start();
c.start();
}
}

Descarga el código
Uso de Threads (Parte 2)
Autor: Viruz study
Enlace: Uso de clase Thread (Parte 2)
Admin (Viruz)
Admin (Viruz)
Admin

Mensajes : 148
Fecha de inscripción : 23/09/2012
Edad : 35
Localización : Desktop

https://viruz.foroactivo.mx

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.