Hoy voy a poner un ejemplo de hilos con java, vamos a empezar con un poco de teoría, para crear hilos con java hay dos opciones:
Empezamos vamos a crear un interfaz que se llama Buffer este es su código.
- Extender de la clase Thread.
- Implementar la interfaz Runnable.
Empezamos vamos a crear un interfaz que se llama Buffer este es su código.
/** * Interfaz que permite crear un buffer entre el consumidor y productor * @author Xabe */ public interface Buffer{ /** * Ponemos un valor en el Buffer * @param value */ public void putValue(T value); /** * Obtenemos el valor generico * @return */ public T getValue(); /** * Muestra un mensaje de información sobre quien pone un valor * @param value */ public void messagePut(T value); /** * Muestra un mensaje de información sobre quien obtiene un valor * @param value */ public void messageGet(T value); }
/** * Buffer sin sincronizar * @author xabe * */ public class BufferSinSinconizar implements Buffer{ private Integer lista[]; /** * Construye un array de un elemento para almacenar los datos */ public BufferSinSinconizar() { lista = new Integer[] {-1}; } public Integer getValue() { Integer value = lista[0]; lista[0] = -1; messageGet(value); return value; } public void putValue(Integer value) { messagePut(value); lista[0] = value; } public void messageGet(Integer value) { System.out.println("El hilo : "+Thread.currentThread().getName()+" obtiene el valor "+value); } public void messagePut(Integer value) { System.out.println("El hilo : "+Thread.currentThread().getName()+" pone el valor "+value); } }
public class BufferSincronizado implements BufferAhora vamos a poner el código de Consumidor y Productor{ private Integer lista[]; public BufferSincronizado() { lista = new Integer[] { -1, -1 }; } public synchronized Integer getValue() { while (IsBufferVacio()) { try { System.out.println(Thread.currentThread().getName() + " trata de leer."); System.out.println("Bufer vacio."); wait(); } // si se interrumpió el subproceso en espera, imprimir el rastreo de // la pila catch (InterruptedException excepcion) { excepcion.printStackTrace(); } } int value = -1; for (int i = 0; i < lista.length; i++) { if (lista[i] != -1) { value = lista[i]; lista[i] = -1; break; } } notify(); messageGet(value); return value; } public synchronized void putValue(Integer value) { while (IsBufferLleno()) { try { System.out.println(Thread.currentThread().getName() + " trata de escribir."); System.out.println("El Bufer esta lleno."); wait(); } catch (InterruptedException excepcion) { excepcion.printStackTrace(); } } for (int i = 0; i < lista.length; i++) { if (lista[i] == -1) { lista[i] = value; break; } } messagePut(value); notify(); } public boolean IsBufferLleno() { boolean lleno = true; for (Integer valor : lista) { if (valor == -1) { lleno = false; break; } } return lleno; } public boolean IsBufferVacio() { boolean vacio = true; for (Integer valor : lista) { if (valor > -1) { vacio = false; break; } } return vacio; } public void messageGet(Integer value) { System.out.println("El hilo : " + Thread.currentThread().getName() + " obtiene el valor " + value); } public void messagePut(Integer value) { System.out.println("El hilo : " + Thread.currentThread().getName() + " pone el valor " + value); } }
public class Consumidor implements Runnable { private Thread thread; private Bufferbuffer; public Consumidor(String name, Buffer buffer) { this.thread = new Thread(this, name); this.buffer = buffer; } public void run() { int suma = 0; try { for (int cuenta = 1; cuenta <= 4; cuenta++) { Thread.sleep((int) (Math.random() * 3001)); suma += buffer.getValue(); } } catch (InterruptedException excepcion) { excepcion.printStackTrace(); } System.out .println(thread.getName() + " leyo valores, dando un total de: " + suma + ".\nTerminando"); } public void start() { this.thread.start(); } }
public class Productor implements Runnable { private Thread thread; private BufferPor ultimo la clase Main que invoca a los hilosbuffer; public Productor(String name, Buffer buffer) { this.thread = new Thread(this, name); this.buffer = buffer; } public void run() { try { for (int cuenta = 1; cuenta <= 4; cuenta++) { Thread.sleep((int) (Math.random() * 3001)); buffer.putValue(cuenta); } } catch (InterruptedException excepcion) { excepcion.printStackTrace(); } System.out .println(thread.getName() + " puso valores" + ".\nTerminando"); } public void start() { this.thread.start(); } }
public static void main(String[] args) { BufferCon este ejemplo vemos como se crea hilos y como sincronizar los hilos.buffer = new BufferSincronizado(); // Buffer buffer = new BufferSinSinconizar(); Consumidor consumidor = new Consumidor("Consumidor", buffer); Productor productor = new Productor("Productor", buffer); productor.start(); consumidor.start(); }
No hay comentarios:
Publicar un comentario