Cuando ejecutamos una aplicación del mundo real, utilizamos procesadores potentes para una ejecución más rápida. Sin embargo, solo la velocidad del procesador no puede hacer que su aplicación se ejecute rápidamente. Una de las excelentes maneras de crear una aplicación eficiente en rendimiento es utilizar el multihilo.
¿Qué es el multihilo?
El multihilo es un concepto de programación en el cual la aplicación puede crear una pequeña unidad de tareas para ejecutarse en paralelo. Si estás trabajando en una computadora, ejecuta múltiples aplicaciones y asigna potencia de procesamiento a ellas. Un programa simple se ejecuta en secuencia y las declaraciones de código se ejecutan una por una. Esto es una aplicación de un solo hilo. Pero, si el lenguaje de programación admite la creación de varios hilos y los pasa al sistema operativo para ejecutarse en paralelo, se llama multihilo.
Multihilo vs Multiproceso
Cuando hablamos de multihilo, no nos importa si la máquina tiene un procesador de 2 núcleos o un procesador de 16 núcleos. Nuestro trabajo es crear una aplicación multihilo y permitir que el sistema operativo maneje la asignación y ejecución. En resumen, el multihilo no tiene nada que ver con el multiproceso.
¿Cómo apoya Java el multihilo?
Java tiene un gran soporte para aplicaciones multihilo. Java admite el multihilo a través de la clase Thread. Java Thread nos permite crear un proceso ligero que ejecuta algunas tareas. Podemos crear múltiples hilos en nuestro programa y comenzarlos. El tiempo de ejecución de Java se encargará de crear instrucciones a nivel de máquina y trabajar con el sistema operativo para ejecutarlas en paralelo.
¿Cuáles son los diferentes tipos de hilos?
Hay dos tipos de hilos en una aplicación: el hilo de usuario (user thread) y el hilo demonio (daemon thread). Cuando iniciamos una aplicación, el hilo main es el primer hilo de usuario creado. Podemos crear múltiples hilos de usuario así como hilos demonio. Cuando todos los hilos de usuario se ejecutan, JVM termina el programa.
¿Qué es la prioridad de un hilo?
Cuando creamos un hilo, podemos asignarle una prioridad. Podemos establecer diferentes prioridades para hilos diferentes, pero no garantiza que un hilo de mayor prioridad se ejecute antes que un hilo de menor prioridad. El planificador de hilos es parte de la implementación del sistema operativo y cuando se inicia un hilo, su ejecución es controlada por el planificador de hilos y la JVM no tiene control sobre su ejecución.
¿Cómo creamos un hilo en Java?
Podemos crear hilos implementando la interfaz Runnable o extendiendo la clase Thread.
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
La línea anterior es una declaración para crear un nuevo hilo. Aquí creamos un objeto Runnable como una clase anónima. Si estás familiarizado con las expresiones lambda, podemos crear un hilo con un código mucho más corto.
Runnable runnable = () -> System.out.println("Hello");
Una vez que hemos creado un hilo, debemos iniciar su ejecución llamando al método start().
runnable.start();
I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.
1. Hilo y Runnable en Java
Este es el primer post sobre la clase Thread y la interfaz Runnable. También aprenderás sobre Procesos y Hilos. ¿Cuál es la diferencia entre Thread y Process? Beneficios de usar Hilos y cómo podemos crear Hilos utilizando la interfaz Runnable y la clase Thread. Este post también compara la interfaz Runnable con la clase Thread.
2. Java Thread Sleep
Java Thread sleep se utiliza para pausar la ejecución del hilo actual. Utilizaremos Thread sleep extensivamente en futuros posts, así que es bueno saber cómo funciona y si es preciso o no.
3. Java Thread Join
A veces necesitamos esperar a que otros hilos terminen su ejecución antes de poder continuar. Podemos lograr esto utilizando el método Thread join, aprende cómo funciona y cuándo debemos usarlo.
4. Estados de los hilos en Java
Comprender los diferentes estados de un hilo es importante. Aprenda cómo un hilo cambia su estado y cómo el planificador de hilos del sistema operativo cambia el estado de un hilo.
5. Java Thread wait, notify y notifyAll
La clase Object de Java contiene tres métodos para comunicar el estado de bloqueo de un recurso. Aprenda con ejemplos de uso de estos métodos de la clase Object en una implementación simple de Espera-Notificación.
6. Seguridad de Hilos y Sincronización
Sabemos que los hilos comparten recursos de objetos, lo que puede provocar corrupción de datos porque estas operaciones no son atómicas. Aprende cómo podemos lograr la seguridad de hilos en Java utilizando diferentes métodos. Lee esta publicación para aprender sobre el uso correcto de la sincronización, métodos sincronizados y bloques sincronizados.
7. Excepción de Java en el hilo principal
La JVM crea el primer hilo utilizando el método main. Esta publicación explica algunas excepciones comunes que vemos en la vida diaria y cuál es su causa raíz y cómo solucionarlas.
8. Seguridad del Hilo en Clase Singleton
En este artículo, aprenderás los conceptos básicos de cómo crear una clase Singleton. ¿Cuáles son los problemas de seguridad del hilo con diferentes implementaciones? ¿Cómo podemos lograr la seguridad del hilo en una clase Singleton?
9. Hilo Demonio en Java
A simple article explaining daemon threads and how we can create daemon threads in java.
10. Hilo Local en Java
**Thread-Local Variables in Java**
Conocemos que los hilos comparten las variables del objeto, pero ¿qué pasa si queremos tener variables locales al hilo creadas a nivel de clase? Java proporciona la clase utilitaria `ThreadLocal` para crear variables locales al hilo. Lee más para aprender cómo podemos crear variables `ThreadLocal` en el programa Java.
11. Volcado de Hilo en Java
El volcado de hilo en Java proporciona información sobre el hilo actual. Un volcado de hilo es útil para analizar problemas de rendimiento en la aplicación. Puedes utilizar el volcado de hilo para encontrar y solucionar situaciones de bloqueo. Esta publicación explica diferentes métodos que se pueden usar para generar volcados de hilo en Java.
12. Cómo Analizar un Bloqueo en Java
El bloqueo es una situación en la que varios hilos están esperando que otros liberen recursos, causando una dependencia cíclica. Este artículo analiza la situación en la que podemos tener un bloqueo en un programa Java. Cómo podemos utilizar un volcado de hilos para encontrar el bloqueo y las mejores prácticas para evitar bloqueos en programas Java.
13. Hilo del Temporizador en Java
Este artículo explica cómo podemos usar las clases Java Timer y TimerTask para crear trabajos que se ejecuten en intervalos programados, un programa de ejemplo que muestra su uso y cómo podemos cancelar el temporizador.
14. Problema del Productor-Consumidor en Java
Antes de Java 5, el problema del productor-consumidor se podía resolver utilizando los métodos wait() y notify(), pero la introducción de BlockingQueue lo ha hecho muy fácil. Aprende cómo podemos usar BlockingQueue para resolver el problema del productor-consumidor en Java.
15. Java Thread Pool
El grupo de hilos de Java es una colección de hilos trabajadores esperando para procesar tareas. La introducción de Java 5 del marco Executor ha facilitado mucho la creación de un grupo de hilos en Java. Podemos utilizar las clases Executors y ThreadPoolExecutor para crear y gestionar un grupo de hilos.
16. Java Callable Future
A veces queremos que nuestro hilo devuelva algunos valores que podemos utilizar. En ese caso, podemos utilizar Callable de Java 5, que es similar a la interfaz Runnable. Podemos utilizar el marco Executor para ejecutar tareas Callable.
17. Ejemplo de Java FutureTask
La clase FutureTask es la clase concreta base que implementa la interfaz Future. La utilizamos con la implementación Callable y Executors para el procesamiento asíncrono. La clase FutureTask proporciona métodos de implementación para verificar el estado de la tarea y devolver el valor al programa que la llama una vez que su procesamiento ha finalizado. Resulta útil cuando deseas anular algunos de los métodos de implementación de la interfaz Future.
Conclusión
La programación multihilo es un tema muy amplio y escribir todo sobre ello en una sola publicación no habría sido posible. Si sigues los posts anteriores en secuencia, aprenderás todo sobre la programación multihilo en Java.
Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java