AjLearning
AjLearning 0.1    





Introducción a Java - Threads

Curso Introducción a Java

    Anterior     Siguiente

Threads

Dentro de un mismo programa, Java permite ejecutar varias tareas a la vez. Esta capacidad está brindada como una de las bases del lenguaje. En otras tecnologías, hay que trabajar con librerías adicionales, y funciones externas. En Java, el manejo de threads (hilos de ejecución dentro de un proceso), se da de manera natural como parte de la librería de base. Tan integrado está, que su soporte es parte del paquete núcleo de Java, el siempre presente java.lang.

En principio, los sistemas operativos ejecutan procesos. Cada proceso tiene un conjunto de atributos, como el usuario asignado, permisos de seguridad, memoria alocada, directorio actual, archivos abiertos, que le pertenecen, y continúan asociados a él hasta que termine su ejecución. Lo que se ejecuta dentro de un proceso, es una serie de instrucciones, generalmente compiladas para la plataforma en la que se está ejecutando. Una a una, esas instrucciones van alterando y manipulando los recursos asignados. Actualmente, los sistemas operativos también permiten que un proceso tenga más de una tarea en ejecución, cada una de las cuales se denomina "thread".

Para tener una idea de la aplicación de threads en un programa, podemos considerar uno simple que tenga que realizar estas actividades:

- Leer bloques o registros de un archivo
- Procesar cada registro
- Grabar un resultado en otro archivo

O podemos querer escribir un programa servidor que:

- Espere la llegada de un cliente
- Atienda a ese cliente
- Vuelva a esperar a la llegada de otro cliente

En vez de ejecutar esas actividades en forma secuencial, puede convenirnos distribuirlas de alguna forma en distintos threads, que aprovechen mejor los recursos de la máquina. Por ejemplo, si poseemos dos procesadores, dependiendo del sistema operativo y la implementación de la máquina virtual de Java que estemos usando, podemos aprovecharlos a ambos. O aún con un sólo procesador, podemos repartir su tiempo de una mejor forma: mientras esperamos que se termine la entrada o salida de algún dato, podemos seguir calculando con el procesador que nos toque.

Así, en el ejemplo de la lectura, proceso y escritura de bloques, podemos repartir cada una de esas actividades en threads distintos.

Cuando completamos la lectura de un bloque, ya estamos en condiciones de comenzar a ejecutar el cálculo, mientras seguimos leyendo el segundo bloque. Y cuando terminamos el cálculo a aplicar sobre el primer bloque, podemos comenzar la grabación del resultado, y seguir calculando sobre el segundo bloque. Esto es posible aún con un solo procesador, porque la entrada y salida son operaciones que en general requieren poco tiempo dedicado del mismo, así que podemos ocuparlo en otras actividades mientras esperamos que se cumplan las tareas de lectura y escritura.

En el caso del servidor, el uso de threads se vuelve más indispensable: cuando un cliente llega y lo atendemos, podemos asignarle esa actividad a un thread, mientras que cuando llega un segundo cliente, lo atendemos en un segundo hilo de ejecución. Para los clientes, parece como que el servidor los atiende a ellos solamente, pero internamente atendemos a tantos clientes como threads hayamos dispuesto para el proceso.

Java ha adoptado desde sus primeras versiones, el soporte de thread. La forma de implementarlos internamente, puede variar de máquina virtual a máquina virtual. Algunas aprovechan se ejecutan dentro de un sólo thread del sistema operativo, otras son capaces de ejecutar varios simultáneamente, usando la presencia de varios procesadores. Pero independientemente de su implementación interna, Java nos da la capacidad de manejarlos y lanzarlos. Esto permite que un programa, al ejecutarse, pueda tener más de una tarea en ejecución. Así, mientras en un thread seguimos atendiendo los pedidos de un usuario, ya sea por consola o por la interfaz gráfica, por otro podemos estar comunicados con un servidor, y por otro estar realizando una consulta a una base de datos. Estudiemos entonces cómo podemos usar esto desde Java.


Programado por Angel J. Lopez www.ajlopez.com