Ejemplo de programación concurrente en Java e introducción de cómo controlar procesos con monitores
En este artículo veremos cómo interactua un programa con dos procesos (threads) independientes que se van intercalando según el procesador los va ejecutando. También introduciremos el concepto de monitor para controlar procesos comunes.
Nos aparecerá por pantalla una cadena de texto del tipo: hola adiós hola adiós hola adiós hola adiós hola adiós hola adiós hola adiós adiós hola hola adiós hola adiós, intercalándose cada vez que se ejecute de forma distinta según el procesador vaya ejecutando los hilos. Podéis cambiar el tiempo entre que se lanza cada proceso para observar distintas ejecuciones.
En el caso anterior los dos procesos eran independientes, pero qué pasa si por ejemplo quisieramos que no se escribiera "adiós" si antes no hubiera un "hola" y viceversa? En ese caso habría que crear un Monitor.
Un monitor es una clase externa que sirve para controlar procesos que tienen elementos en común y en cierta forma tener un cierto control sobre qué proceso se puede o no ejecutar.
Para implementar el ejemplo propuesto veamos este ejemplo:
En este caso creamos la clase Monitor que contiene un entero que indica qué proceso se ejecutará. Como los dos procesos manejan datos en común, en este caso Monitor, es imprescindible usar la palabra clave synchronized para bloquear las posiciones de memoria que usa el método escribir. Luego dentro del while, pausaremos todos los procesos que no les toque ejecutarse. Y ya fuera del while cuando le toque ejecutarse el proceso correspondiente usaremos el método notifyAll() para despertar a todos los threads que estaban em modo espera.
De esta forma conseguimos un intercalamiento de palabras.