Un hilo es un..:
- Facilidad para permitir múltiples actividades dentro de un solo proceso
- Denominado proceso ligero
- Un hilo es una serie de declaraciones ejecutadas
- Cada hilo tiene su propio contador de programa, pila y variables locales
- Un hilo es una secuencia anidada de llamadas de método
- Comparte la memoria, los archivos y el estado de cada proceso
Lee: Multihilo en Java
¿Qué necesidad hay de un hilo o por qué usamos hilos?
- Para realizar un procesamiento asíncrono o en segundo plano
- Aumenta la capacidad de respuesta de las aplicaciones GUI
- Aprovechar los sistemas de multiprocesadores
- Simplificar la lógica del programa cuando hay múltiples entidades independientes
¿Qué sucede cuando se invoca un hilo?
Cuando se invoca un hilo, habrá dos caminos de ejecución. Un camino ejecutará el hilo y el otro camino seguirá la declaración después de la invocación del hilo. Habrá una pila y un espacio de memoria separados para cada hilo.
Factor de riesgo
- Se requiere una coordinación adecuada entre los hilos que acceden a las variables comunes [uso de sincronizados y volátiles] para la vista de consistencia de los datos
- El uso excesivo de los hilos de Java puede ser peligroso para el rendimiento del programa y su mantenimiento.
Hilos en Java
La instalación de los hilos de Java y la API es engañosamente simple:
Cada programa de Java crea al menos un hilo [ hilo principal() ]. Los hilos adicionales se crean a través del constructor de hilos o mediante la instanciación de clases que extienden la clase de hilos.
Creación de hilos en Java
La aplicación de los hilos en el java puede lograrse de dos maneras:
- Extendiendo la clase de hilo java.lang.Thread
- Implementación de la interfaz ejecutable de java.lang.
Nota: El hilo y el ejecutable están disponibles en el paquete java.lang.*
1) Al extender la clase de hilo
- La clase debe extender la clase de Java Thread.
- La clase debe anular el método run().
- La funcionalidad que se espera del Thread que se va a ejecutar está escrita en el método run().
void start(): Crea un nuevo hilo y lo hace ejecutable.
void run(): El nuevo hilo comienza su vida dentro de este método.
Ejemplo:
public class MyThread extiende el hilo { public void run(){ System.out.println("el hilo se está ejecutando..."); } public static void main(String[] args) { MyThread obj = new MyThread(); obj.start();}
2) Implementando la interfaz ejecutable
- La clase debe implementar la interfaz Runnable
- La clase debe implementar el método run() en la interfaz Runnable
- La funcionalidad que se espera que el Hilo se ejecute se pone en el método run()
Ejemplo:
public class MyThread implementa Runnable { public void run(){ System.out.println("thread is running..")); } public static void main(String[] args) { Thread t = new Thread(new MyThread()); t.start();}
Extiende la clase de hilo vs Implementa la interfaz ejecutable?
- Extender la clase Thread hará que tu clase sea incapaz de extender otras clases, debido a la característica de herencia única en JAVA. Sin embargo, esto te dará una estructura de código más simple. Si implementas Runnable, puedes obtener un mejor diseño orientado a objetos y consistencia y también evitar los problemas de herencia única.
- Si sólo quieres conseguir la funcionalidad básica de un hilo, puedes implementar simplemente la interfaz Runnable y anular el método run(). Pero si quieres hacer algo serio con el objeto del hilo ya que tiene otros métodos como suspend(), resume(), ..etc que no están disponibles en la interfaz Runnable entonces puede que prefieras extender la clase Thread.
Ciclo de vida del hilo en java
Lea el artículo completo en: Ciclo de vida de los hilos en Java
Hilo final
Un hilo termina por las siguientes razones:
- El hilo termina cuando llega el momento en que el método run() termina su ejecución.
- Cuando el hilo lanza una excepción o un error que no está siendo atrapado en el programa.
- El programa de Java se completa o termina.
- Otro hilo llama a los métodos stop().
Sincronización de Hilos
- En muchos casos, los hilos que se ejecutan simultáneamente comparten datos y dos hilos intentan hacer operaciones sobre las mismas variables al mismo tiempo. Esto a menudo resulta en datos corruptos ya que dos hilos intentan operar con los mismos datos.
- Una solución popular es proporcionar algún tipo de bloqueo primitivo. Sólo un hilo puede adquirir un bloqueo particular en un momento dado. Esto se puede lograr usando una palabra clave «sincronizado» .
- Usando el sincronizado sólo un hilo puede acceder al método a la vez y una segunda llamada será bloqueada hasta que la primera llamada regrese o se llame a wait() dentro del método sincronizado.
Bloqueo
Siempre que hay múltiples procesos que se disputan el acceso exclusivo a múltiples cerraduras, existe la posibilidad de bloqueo. Se dice que un conjunto de procesos o hilos están bloqueados cuando cada uno de ellos espera una acción que sólo uno de los otros puede realizar.
Para evitar el bloqueo, hay que asegurarse de que cuando se adquieren varios bloqueos, se adquieren siempre en el mismo orden en todos los hilos.
Directrices para la sincronización
- Mantén los bloques cortos. Los bloques sincronizados deben ser cortos, tan cortos como sea posible, sin dejar de proteger la integridad de las operaciones de datos relacionadas.
- No bloquee. Nunca llame a un método que pueda bloquear, como InputStream.read(), dentro de un bloque o método sincronizado.
- No invoque métodos en otros objetos mientras mantiene un bloqueo. Esto puede sonar extremo, pero elimina la fuente más común de bloqueo.
Palabras clave de destino: Hilos de Java, ejemplo de javathread, crear un hilo de java, java ejecutable