Introducción a concurrencia
La concurrencia en Java es un término que cubre multithreading, concurrencia y paralelismo en la plataforma. Con esto podemos agrupar las herramientas, problemas, y soluciones que surgen en el lenguaje. En esta lección veremos los conceptos claves para trabajar con concurrencia en Java.
¿Qué es el multithreading?
El multithreading significa que tenemos múltiples hilos de ejecución (en inglés, threads) dentro de la misma aplicación. Un hilo es como un CPU aparte que ejecuta nuestra aplicación. Entonces, una aplicación multithreaded es aquella que tiene múltiples hilos de ejecución ejecutando diferentes partes de la aplicación al mismo tiempo.
Un hilo, a su vez, no es igual a un CPU. Usualmente un CPU compartirá tiempo de ejecución entre múltiples hilos, cambiando entre la ejecución de los hilos durante un corto periodo de tiempo. Esto se conoce como time slicing. También en posible hacer que los hilos de ejecución se ejecuten en diferentes CPUs.
Ventajas del multithreading
Mejor uso de un solo CPU
Uno de los principales motivos es poder utilizar mejor los recursos en la computadora. Por ejemplo, si un hilo espera la respuesta a una solicitud enviada a un servidor, entonces otro hilo puede usar la CPU para hacer algo más. Además, si la computadora tiene múltiples CPUs, o si la CPU tiene múltiples núcleos, entonces el multithreading puede ayudar a que nuestra aplicación use estos núcleos adicionales.
Mejor uso de múltiples CPUs o núcleos
Si una computadora tiene múltiples CPUs o la CPU contiene múltiples núcleos, entonces debemos usar múltiples hilos para que nuestra aplicación pueda usar estos recursos. Por ejemplo, si tenemos un programa que necesita procesar una gran cantidad de datos, entonces podemos dividir el trabajo en múltiples hilos, cada uno procesando una parte de los datos.
Mejor experiencia de usuario
Otro motivo para el uso de multithreading es brindar una mejor experiencia de usuario. Por ejemplo, si hacemos clic en un botón y esto envía una solicitud a un servidor, entonces importa el hilo que realice esta solicitud.
Si usamos el mismo hilo que también actualiza la interfaz gráfica, entonces el usuario puede experimentar una interfaz congelada mientras el hilo de GUI espera la respuesta de la solicitud. En lugar de esto, dicha solicitud puede ser realizada por un hilo separado, permitiendo que el hilo de GUI siga actualizando la interfaz gráfica.
Multithreading versus Multitasking
En un principio, las computadoras contaban con un solo CPU, y solo podían ejecutar un solo programa a la vez. Sin embargo, con el tiempo las computadoras se volvieron más rápidas y se agregaron más CPUs, lo que permitió ejecutar múltiples programas al mismo tiempo. Esto se conoce como multitasking.
Multitasking
Posteriormente, surgió el multitasking, lo que significa que las computadoras pueden ejecutar múltiples programas (tareas o procesos) al mismo tiempo. Aunque, en realidad no era al mismo tiempo. Esa única CPU se compartía entre los programas. El sistema operativo dividía el tiempo entre los programas que se ejecutan, de manera que cada programa tenía la ilusión de que se estaba ejecutando al mismo tiempo.
En la imagen podemos ver cómo el CPU trabajaba en un programa por un tiempo, luego cambiaba a otro programa, y así sucesivamente. El sistema operativo se encarga de cambiar entre los programas.
Multithreading
Luego llegó el multithreading, que significa que podríamos tener múltiples hilos de ejecución dentro de un mismo programa. Un hilo de ejecución se puede pensar como una CPU que ejecuta el programa. Cuando tenemos múltiples hilos ejecutando el mismo programa, es como tener múltiples CPUs ejecutando el programa.
El multithreading se da dentro de la misma aplicación en este caso. Entonces, en lugar de tener un hilo de ejecución en una aplicación, podemos tener varios. Por ejemplo, la aplicación de música podría descargar un archivo en un hilo, y en otro reproducir música que ya tenemos descargada.
En la imagen vemos cómo la CPU trabaja un momento en un hilo, y luego en otro. Y luego de esto, cambia a otra aplicación haciendo lo mismo.
Las computadoras actuales incluyen varios CPUs o múltiples núcleos como vemos acá. Acá podemos tener el caso de ejecutar aplicaciones simultáneamente dado que cada núcleo trabaja en una aplicación diferente. Es posible que una aplicación trabaje en hilos de diferentes núcleos.