Bienvenidos al Blog de Aldo Malaver

Este Blog contiene articulos que te ayudaran a resolver muchos problemas, comenta cada articulo por favor. Gracias.

miércoles, 16 de noviembre de 2011

Manejo de Colecciones Concurrentes


Manejo de Colecciones Concurrentes
Actualmente estoy haciendo un trabajo  con colas y se me presento un caso de colas, donde tenía una cola que tenía como elementos cadenas que luego iban a ser consumidos por n hilos. Entonces para eso cree una cola Java utilizando el objeto Queue<Objeto>.

import java.util.Queue;

public class Prueba implements Runnable{

      private Queue<String> cola;

      public Prueba(){
            cola = new LinkedList<String>();
      }
}


Además la clase implementa la interface Runnable
      public Queue<String> getCola() {
            return cola;
      }

      public void run() {
            while(true){
                  if(cola.size() > 0)
                        mostrarMensaje(cola.remove());
            }
           
      }
     
      public void mostrarMensaje(final String mensaje){
            System.out.println(mensaje);
      }
     

Por último creamos un public static void main para poder agregar datos a la cola y correr los n hilos.
public static void main(String [] args){
      Queue<String> cola = new LinkedList<String>();
      for(int i = 0; i < 1000; i++){
            cola.add(String.valueOf(i));
            System.out.println(i);
      }
      Prueba p = new Prueba(cola);
      Prueba p2 = new Prueba(cola);
      new Thread(p).start();
      new Thread(p2).start();            
}

Si nos damos cuenta, en el método run tenemos que preguntar si la cola que estamos utilizando tiene elementos, sino hacemos eso, nuestro programa nos arrojará un error. También nos podría dar problema con los hilos y el mismo acceso a la cola por lo Java ha desarrollado clases para trabajar con más eficiencia los hilots y la multitarea.
Para eso utilizaremos colecciones concurrentes para poder iniciar n hilos y que no haya problemas de concurrencia. Java tiene un paquete java.util.concurrent para cual utilizaramos la interfaz BlockingQueue y la clase
public class Prueba1 implements Runnable{

      public BlockingQueue<String> cola;
     
      public Prueba1(BlockingQueue<String> cola){
            this.cola = cola;
      }

      public BlockingQueue<String> getCola() {
            return cola;
      }

      public void setCola(BlockingQueue<String> cola) {
            this.cola = cola;
      }
     
      public void run() {
            while(true){
                  try {
                        mostrarMensaje(cola.take());
                  } catch (InterruptedException e) {                  
                        e.printStackTrace();
                  }
            }
           
      }
     
      public void mostrarMensaje(String mensaje){
            System.out.println(mensaje);
      }
     
      public static void main(String [] args){
            BlockingQueue<String> cola = new LinkedBlockingQueue<String>();
            for(int i = 0; i < 1000; i++){
                  cola.add(String.valueOf(i));
                  System.out.println(i);
            }          
     
            Prueba1 p = new Prueba1(cola);
            Prueba1 p2 = new Prueba1(cola);
            new Thread(p).start();
            new Thread(p2).start();

      }

En esta clase ya no es necesario preguntar si la cola tienes valores, la interfaz BlockingQueue utiliza multitarea y por lo cual verifica los elementos de la cola, administra bien los bloqueos.


No te olvides de donar para poder crear más publicaciones.

No hay comentarios:

Publicar un comentario