¿Qué son los hilos de Java?
Un hilo es un:
- Capacidad para permitir múltiples actividades dentro de un solo proceso
- Indicado como proceso ligero
- Un hilo es una serie de instrucciones ejecutadas
- Cada hilo tiene su propio contador de programa, pila y variables locales
- Un hilo es una secuencia anidada de llamadas a métodos
- Comparta memoria, archivo y estado por proceso
Lectura: multiproceso en Java
¿Cuál es la necesidad de un hilo o por qué usamos hilos?
- Para realizar procesamiento asincrónico o en segundo plano
- Aumente la capacidad de respuesta de las aplicaciones GUI
- Aproveche los sistemas multiprocesador
- Simplifique la lógica del programa cuando hay varias entidades independientes
¿Qué sucede cuando se llama a un hilo?
Cuando se llama a un hilo, habrá dos rutas de ejecución. Una ruta ejecutará el hilo y la otra seguirá la declaración después de que se invoque el hilo. Habrá una pila y un espacio de memoria separados para cada hilo.
Factor de riesgo
- Se requiere una coordinación adecuada entre los subprocesos que acceden a variables comunes [use of synchronized and volatile] para una vista coherente de sus datos
- El uso excesivo de subprocesos de Java puede ser peligroso para el rendimiento del programa y su capacidad de mantenimiento.
Discusiones en Java
La estructura y la API de los subprocesos de Java son engañosamente simples:
Cada programa java crea al menos un hilo [ main() thread ]. Se crean subprocesos adicionales a través del constructor Thread o instanciando clases que amplían la clase Thread.
Creando hilos en Java
La implementación del hilo en java se puede lograr de dos maneras:
- Extensión de la clase java.lang.Thread
- Implementación de la interfaz java.lang.Runnable
Nota: Thread y Runnable están disponibles en el paquete java.lang. *
1) Ampliando la clase de hilo
- La clase debería extender la clase Java Thread.
- La clase debe anular el método run ().
- La funcionalidad que se espera que ejecute Thread se escribe 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 extends Thread { public void run(){ System.out.println("thread is running..."); } public static void main(String[] args) { MyThread obj = new MyThread(); obj.start(); }
2) Implementación de 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 ejecute el Thread se coloca en el método run ()
Ejemplo:
public class MyThread implements 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 con respecto a la interfaz ejecutable de las herramientas?
- La extensión de la clase Thread hará que su clase no pueda extender otras clases, debido a la característica de herencia única en JAVA. Sin embargo, esto le dará una estructura de código más simple. Si implementa Runnable, puede lograr una mejor consistencia y un diseño orientado a objetos y evitar incluso problemas de herencia únicos.
- Si solo desea obtener la funcionalidad básica de un hilo, puede implementar la interfaz Runnable y anular el método run (). Pero si desea hacer algo serio con el objeto hilo, ya que tiene otros métodos como suspender (), resume (), ..etc que no están disponibles en la interfaz Runnable, es posible que prefiera extender la clase Thread.
Ciclo de vida del hilo en java
Lea el artículo completo sobre: ciclo de vida de los subprocesos de Java
Discusión final
Un hilo termina por las siguientes razones:
- El hilo finaliza cuando llega cuando el método run () finaliza su ejecución.
- Cuando el hilo arroja una excepción o un error que no está atrapado en el programa.
- El programa Java se completa o finaliza.
- Otro hilo llama a los métodos stop ().
Sincronización de subprocesos
- En muchos casos, los subprocesos que se ejecutan simultáneamente comparten datos y dos subprocesos intentan realizar operaciones en las mismas variables al mismo tiempo. Esto a menudo da como resultado datos corruptos ya que dos subprocesos intentan operar con los mismos datos.
- Una solución popular es proporcionar algún tipo de bloque primitivo. Solo un hilo puede adquirir un bloqueo particular en un momento dado. Esto se puede lograr utilizando una palabra clave “sincronizada”.
- Al usar la sincronización, solo un subproceso puede acceder al método a la vez y se bloqueará una segunda llamada hasta que se devuelva la primera llamada o se llame a wait () dentro del método sincronizado.
Punto muerto
Siempre que varios procesos compiten por el acceso exclusivo a varios bloqueos, existe la posibilidad de un punto muerto. Se dice que un conjunto de procesos o subprocesos está bloqueado cuando cada uno está esperando una acción que solo uno de los otros puede realizar.
Para evitar interbloqueos, debe asegurarse de que cuando adquiere múltiples bloqueos, siempre adquiere los bloqueos en el mismo orden en todos los subprocesos.
Pautas de sincronización
- Mantenga los bloques cortos. Los bloques sincronizados deben ser cortos, lo más cortos posible, al tiempo que se protege la integridad de las operaciones de datos relacionadas.
- No bloquees. Nunca llame a un método que pueda fallar, como InputStream.read (), dentro de un bloque o método sincronizado.
- No invoque métodos en otros objetos mientras mantiene un candado. Esto puede parecer extremo, pero elimina la fuente más común de interbloqueos.
Objetivo de palabra clave: Hilo de Java, ejemplo javathread, crear hilo de Java, Java Runnable