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.