38

Hemos hablado anteriormente de los sistemas multiusuarios y el uso de Threads, los cuales nos ayudan a poder realizar tareas de manera “simultanea”. Java utiliza un modelo de hilos, del cual hablaremos un poco a grandes rasgos en esta entrada.

Los sistemas multihilo aprovechan la circunstancia de que la mayoría de los hilos computacionales invierten la mayor parte del tiempo esperando a que un recurso quede disponible, o bien esperando a que se cumpla alguna condición de temporización. Si fuésemos capaces de describir todas las tareas como hilos de control independientes, conmutando de manera automática entre una tarea que esté lista para pasar a un modo de espera, y otra que sí tenga algo que hacer, conseguiríamos realizar una cantidad mayor de trabajo en el mismo intervalo de tiempo.

Java se diseñó partiendo de cero, en un mundo en el que el entorno multihilo, a nivel de sistema operativo, era una realidad. El intérprete de Java hace uso intensivo de hilos para multitud de propósitos, y todas las bibliotecas de clases se diseñaron teniendo en mente el modelo multihilo. Una vez que un hilo comienza su tarea, puede suspenderse, lo que equivale a detener temporalmente su actividad. El hilo suspendido puede reanudarse, lo que supone que continúa su tarea allí donde la dejó. En cualquier momento, un hilo puede detenerse, finalizando su ejecución de manera inmediata. Una vez detenido, el proceso no puede reiniciarse.

Prioridades de hilo

El intérprete de Java utiliza prioridades para determinar cómo debe comportarse cada hilo con respecto a los demás. Las prioridades de hilo son valores entre 1 y 10 que indican la prioridad relativa de un hilo con respecto a los demás.

Sincronización

Ya que los hilos permiten y potencian el comportamiento asíncrono de los programas, debe existir alguna manera de forzar el sincronismo allí donde sea necesario. Por ejemplo, si quisiéramos que dos hilos se comunicasen para compartir una estructura de datos compleja (como una lista enlazada), necesitará alguna manera de garantizar que cada uno se aparte del camino del otro. Java incorpora una versión rebuscada de un modelo clásico para la sincronización, el monitor. La mayor parte de los sistemas multihilo implementan los monitores a modo de objetos, pero Java proporciona una solución más elegante: no existe la clase monitor, cada objeto lleva asociado su propio monitor implícito, en el que puede entrar sin más que hacer una llamada a los métodos synchronized del objeto. Una vez que el hilo está dentro del método synchronized, ningún otro hilo puede efectuar una llamada a otro método synchronized sobre el mismo objeto.

Intercambio de mensajes

Una vez que el programa se ha dividido en sus partes lógicas, a modo de hilo, es preciso definir exactamente como se comunicarán entre si dichos hilos. Java utiliza los métodos wait y notify para el intercambio de información entre hilos.

Bien, es así como nos damos cuenta que Java desde el momento en que fue creado. Ya fue hecho con la idea de poder ser un sistema multihilos. En nuestra siguiente sesión, veremos un breve ejemplo de cómo utilizar estos hilos de ejecución.