Ciclo de vida del hilo en Java

Publicado: 2023-01-27

Tabla de contenido

Conceptos básicos de los subprocesos de Java:

Un hilo en Java facilita la realización de múltiples actividades dentro de un solo proceso. Se considera un proceso ligero. Un hilo también se puede definir como una secuencia de sentencias ejecutadas. Cada subproceso en Java tiene su propia pila, contador de programa y variables locales. Los subprocesos de Java también pueden ser una serie anidada de llamadas a métodos. La memoria, el estado por proceso y los archivos son compartidos por subprocesos.

Usos de hilos en Java:

    • Para realizar procesamiento en segundo plano o asíncrono
    • Para mejorar la sensibilidad de las aplicaciones GUI
    • Para implementar los aspectos positivos de los sistemas multiprocesador
    • Para agilizar la lógica de programación en el caso de la existencia de múltiples

Existen dos rutas de ejecución cuando se llama a un subproceso. Una de las dos rutas se usa para la ejecución del subproceso y la otra seguirá la instrucción que sigue a la invocación del subproceso. Cada subproceso en Java tiene un espacio de memoria y una pila separados.

Los factores de riesgo encontrados al usar subprocesos en códigos Java son los siguientes.

  • Se requiere una coordinación adecuada entre los subprocesos en los casos en que los subprocesos acceden a variables comunes para ver los datos de forma coherente.
  • El rendimiento y mantenimiento de los hilos, si se usan en exceso en los programas, se vuelve difícil.

Ciclo de vida de los hilos en Java:

En cualquier instante de la ejecución del programa, los subprocesos en Java existen en cualquiera de los estados mencionados a continuación.

  1. Nuevo
  2. Obstruido
  3. Ejecutable
  4. Espera cronometrada
  5. Esperando
  6. Terminado

Una vista detallada del ciclo de vida del hilo en Java

Nuevo hilo:

El subproceso recién creado está en el estado 'Nuevo'. No está progresado para ejecutarse en este estado. La ejecución del código de un hilo en el nuevo estado aún no ha tenido lugar. Aún está por ejecutarse.

Estado ejecutable:

Los subprocesos en el estado ejecutable están listos para ejecutarse. Un subproceso en este estado puede estar listo para ejecutarse en cualquier momento o puede que ya se esté ejecutando. El planificador de subprocesos perfecciona la responsabilidad de asignar tiempo para que se ejecute el subproceso. A cada subproceso individual se le asigna un tiempo específico en un programa de subprocesos múltiples. Cada subproceso individual se ejecuta durante un período breve y luego encuentra una pausa. Luego, la CPU se cede a otro subproceso para brindar la oportunidad de que se ejecuten los otros subprocesos. En este punto, todos los subprocesos listos para ejecutar que están esperando la CPU y los subprocesos que se están ejecutando actualmente se encuentran en un estado ejecutable.

Consulte nuestros cursos de tecnología gratuitos para obtener una ventaja sobre la competencia.

Explore nuestros cursos populares de ingeniería de software

Maestría en Ciencias en Ciencias de la Computación de LJMU & IIITB Programa de Certificado de Ciberseguridad Caltech CTME
Bootcamp de desarrollo de pila completa Programa PG en Blockchain
Programa Ejecutivo PG en Desarrollo Full Stack
Ver todos nuestros cursos a continuación
Cursos de ingeniería de software

Estado de espera/bloqueado:

Un subproceso se encuentra en cualquiera de los estados mencionados a continuación cuando no está funcionando temporalmente.

  • Esperando
  • Obstruido

Un subproceso que espera la finalización de la E/S está en estado bloqueado. La función del programador de subprocesos es programar la ejecución de un subproceso bloqueado o en espera reactivándolo. No se permite la continuación de la ejecución de ningún subproceso en este estado hasta que se transforme en un estado ejecutable. Los subprocesos en estado de bloqueo o de espera no utilizan ningún ciclo de CPU.

Un subproceso se ve obligado a bloquearse cuando intenta acceder a la sección protegida de un código que está protegida por algún otro subproceso en este momento. El programador transforma uno de los subprocesos que esperan una sección protegida en un estado ejecutable cuando la sección está desbloqueada para todos los subprocesos. Por otro lado, un subproceso existe en un estado de espera mientras espera al otro subproceso en una condición particular. Los subprocesos en el estado de espera se empujan a un estado ejecutable una vez que se cumple la condición especificada para la espera. Si un subproceso que se está ejecutando actualmente se mueve a un estado de espera/bloqueado, el programador de subprocesos programa otro subproceso de la secuencia ejecutable para que se ejecute.

Tiempo de espera:

Cuando se invoca un método con un argumento de tiempo de espera, el subproceso existe en un estado de espera cronometrado. Un subproceso continúa en este estado hasta que finaliza el tiempo de espera especificado o hasta que se recibe una notificación. Por ejemplo, un subproceso cambia a un estado de espera cronometrado si invoca espera o suspensión condicional.

Estado terminado:

La terminación de subprocesos se produce por cualquiera de los siguientes motivos.

  • La salida normal del subproceso al finalizar la ejecución de los segmentos de código dentro del subproceso.
  • Ocurrencia de cualquier evento erróneo raro, como una excepción no controlada y una falla de segmentación.

Un subproceso en un estado terminado no consume ningún ciclo de CPU.

Aprenda cursos de desarrollo de software en línea de las mejores universidades del mundo. Obtenga Programas PG Ejecutivos, Programas de Certificado Avanzado o Programas de Maestría para acelerar su carrera.

Habilidades de desarrollo de software bajo demanda

Cursos de JavaScript Cursos básicos de Java Cursos de Estructuras de datos
Cursos de Node.js Cursos SQL Cursos de desarrollo de pila completa
Cursos NFT Cursos DevOps Cursos de Big Data
Cursos de React.js Cursos de Seguridad Cibernética Cursos de computación en la nube
Cursos de diseño de base de datos Cursos de Python Cursos de Criptomonedas

Implementación de estados de subprocesos en Java:

Para lograr el estado actual de un hilo en Java, usamos el método Thread.getState(). Java también ofrece la clase java.lang.Thread.State en la que se definen las constantes ENUM para el estado de un hilo. Los detalles se resumen en la siguiente tabla.

Tipo constante Declaración Descripción
Nuevo Subproceso final estático público. Estado NUEVO Es el estado del hilo del hilo que se acaba de crear y aún no ha comenzado su ejecución.
Ejecutable Subproceso final estático público. Estado EJECUTABLE Describe el estado de un subproceso que ya se está ejecutando o un subproceso que está listo para ejecutarse.

El mismo subproceso puede estar en un estado ejecutable para la máquina virtual de Java y en estado de espera para otros recursos del sistema operativo, como un procesador.

Obstruido Subproceso final estático público. Estado BLOQUEADO Describe el estado de un subproceso que está bloqueado esperando el bloqueo del monitor. Permanece en el mismo estado hasta que el bloque del monitor ingresa a un método/bloque sincronizado o vuelve a ingresar al método sincronizado después de invocar Object.wait().
Esperando Subproceso final estático público. Estado ESPERANDO Describe el estado de un hilo que está esperando debido a la invocación de uno de los siguientes métodos.

  1. Object.wait sin tiempo de espera
  2. LockSupport.parque
  3. Thread.join sin tiempo de espera

El estado de espera puede deberse a la finalización de una tarea en particular por parte de otro subproceso.

Espera cronometrada Subproceso final estático público. Estado TIMED_WAITING Es un estado del hilo que espera un tiempo específico. La invocación de cualquiera de los siguientes métodos da como resultado un estado de espera cronometrado de un subproceso con un tiempo de espera positivo asignado.

  1. Thread.join con tiempo de espera
  2. Object.wait con tiempo de espera
  3. LockSupport.partHasta
  4. LockSupport.parkNanos
Terminado Subproceso final estático público. Estado TERMINADO Es el estado de un subproceso que ha completado la ejecución de sus declaraciones de código constituyentes.

El subproceso descansa en un estado NUEVO cuando se acaba de crear. Cuando se invoca el método .start() en un subproceso, el programador de subprocesos lo mueve a un estado Runnable. Cuando se invoca el método join() en una instancia de subproceso, el subproceso que está ejecutando la declaración de código actualmente esperará a que finalice este subproceso. Entonces, antes de la impresión de la instrucción final en la consola, el programa invoca la función join() en el subproceso 2 y mantiene el subproceso1 en espera hasta que el subproceso2 completa su ejecución y pasa al estado Terminado. Dado que el subproceso1 está esperando la finalización de la ejecución del subproceso2, se pone en el estado EN ESPERA.

Lea nuestros artículos populares relacionados con el desarrollo de software

¿Cómo implementar la abstracción de datos en Java? ¿Qué es la clase interna en Java? Identificadores de Java: definición, sintaxis y ejemplos
Comprender la encapsulación en OOPS con ejemplos Argumentos de línea de comando en C explicados Las 10 funciones y características principales de la computación en la nube en 2022
Polimorfismo en Java: conceptos, tipos, características y ejemplos ¿Paquetes en Java y cómo usarlos? Tutorial de Git para principiantes: Aprende Git desde cero

Ventajas y limitaciones del uso de subprocesos en programas Java:

El uso de hilos en programas Java tiene los siguientes beneficios.

  • Reducción del tiempo necesario para desarrollar el código.
  • Costes de mantenimiento reducidos
  • Rendimiento mejorado de aplicaciones complejas
  • Impulsar la capacidad de respuesta de las interfaces de usuario
  • Paralelización de las tareas
  • Los subprocesos se utilizan en aplicaciones de servidor para mejorar el alto rendimiento y la utilización de recursos.
  • Si un subproceso no puede utilizar todos los recursos informáticos de la CPU, la ejecución de otro subproceso los mantendrá ocupados.
  • Si varios subprocesos operan el mismo conjunto de datos, su caché se puede compartir. Esto conduce a un mejor uso de la memoria caché o la armonización de sus valores.

Existen varios inconvenientes en el uso de subprocesos en programas Java. Algunos de ellos se enumeran a continuación.

  • Al compartir cachés, búferes de búsqueda de traducción (TLB) o cualquier otro recurso de hardware, varios subprocesos pueden interferir entre sí.
  • Incluso cuando solo funciona un subproceso, el tiempo de ejecución de un subproceso no se puede mejorar. Sin embargo, se permite la degradación del tiempo de ejecución. Esto puede deberse a las etapas de tubería adicionales y/o las frecuencias más lentas que se requieren para acomodar el hardware de conmutación de subprocesos.
  • Se requieren numerosos cambios tanto en los sistemas operativos como en los programas de aplicación en comparación con el multiprocesamiento porque el soporte de hardware está más expuesto al software en los subprocesos múltiples.

Si está interesado en obtener más información sobre Java, desarrollo de software de pila completa, consulte el programa Executive PG de upGrad & IIIT-B en desarrollo de software: especialización en desarrollo de pila completa, que está diseñado para profesionales que trabajan y ofrece más de 500 horas de formación rigurosa. , más de 9 proyectos y asignaciones, estado de exalumno de IIIT-B, proyectos finales prácticos prácticos y asistencia laboral con las mejores empresas.

¿Quieres compartir este articulo?

Prepárese para una carrera del futuro

Solicite ahora la Maestría en Ingeniería de Software