multithreading java tutorial with examples
Este tutorial explica todo sobre el subproceso múltiple en Java, la implementación de simultaneidad, el ciclo de vida de un subproceso, el ejemplo de clase de subproceso, el subproceso mediante la interfaz ejecutable:
La concurrencia en el mundo de las computadoras es la capacidad de un sistema (ya sea una aplicación, una computadora o un lenguaje de programación) para ejecutar varias instancias de un programa o aplicación en paralelo.
Al ejecutar instancias o programas al mismo tiempo, aseguramos un alto rendimiento y un mayor rendimiento, ya que podemos utilizar los recursos sin explotar como el hardware del sistema operativo, etc. Por ejemplo, si un sistema tiene varias CPU, la aplicación puede utilizar estas CPU de manera eficaz y aumentar el rendimiento.
=> Visite aquí para ver la serie exclusiva de tutoriales de formación en Java.
Lo que vas a aprender:
- ¿Qué es el multiproceso en Java?
- ¿Qué es un hilo en Java?
- Conclusión
¿Qué es el multiproceso en Java?
En Java, los subprocesos pueden verse como la columna vertebral de la concurrencia. Un hilo es una unidad liviana y ejecutable que accede a recursos compartidos, así como a su propia pila de llamadas.
Una aplicación Java es un proceso y dentro de esta aplicación, podemos tener varios subprocesos para lograr la concurrencia.
Sabemos que una aplicación que se ejecuta en el sistema puede tener varias instancias y, por lo general, se denominan aplicaciones de múltiples documentos. Estas instancias de aplicación se denominan procesos. A cada uno de estos procesos se le asigna una unidad de ejecución conocida como hilo.
Dependiendo del sistema operativo y los requisitos de la aplicación, al proceso se le puede asignar un único hilo o varios hilos. Cuando al proceso de aplicación se le asignan varios subprocesos, entonces debemos ejecutar estos múltiples subprocesos simultáneamente.
“ Esta técnica de ejecutar o ejecutar varios subprocesos de forma simultánea o simultánea se conoce como subprocesos múltiples .”
Multithreading simplemente significa que tenemos más de un hilo ejecutándose dentro de la misma aplicación.
El lenguaje de programación Java tiene soporte integrado para subprocesos múltiples.
El subproceso múltiple se muestra en el diagrama anterior. Como se muestra, hay varios subprocesos que se ejecutan simultáneamente dentro de una aplicación.
Por ejemplo, una aplicación de escritorio que proporciona funciones como edición, impresión, etc. es una aplicación multiproceso. En esta aplicación, como la impresión es un proceso en segundo plano, podemos realizar la edición de documentos y la impresión de documentos simultáneamente asignando estas funciones a dos subprocesos diferentes.
Los subprocesos en aplicaciones multiproceso se ejecutan en paralelo entre sí de manera concurrente. Por lo tanto, el multiproceso también es parte de la concurrencia en Java. Tenga en cuenta que, aunque hay varios subprocesos, comparten el área de memoria, lo que ahorra memoria. Además, los hilos pueden cambiar de contexto fácilmente en poco tiempo.
El subproceso múltiple es principalmente útil ya que proporciona la ejecución simultánea de dos o más partes de una aplicación. Esto permite que la aplicación utilice el tiempo de la CPU al máximo y el tiempo de inactividad se mantenga al mínimo.
Los siguientes son algunos de los términos que debemos conocer en relación con el entorno de subprocesos múltiples, ya que se utilizan con frecuencia.
Multitarea: En la multitarea, se ejecuta más de una tarea al mismo tiempo.
Multihilo: El subproceso múltiple, como ya se mencionó, es un proceso de ejecución de varios subprocesos simultáneamente.
puerta de enlace predeterminada no disponible windows 10 2019
Multiprocesamiento: En multiprocesamiento, se ejecuta más de un proceso simultáneamente. Similar a la multitarea, pero aquí está involucrada más de una CPU.
Procesamiento en paralelo: El procesamiento en paralelo es una técnica en la que varias CPU funcionan simultáneamente en un sistema informático.
Habiendo discutido el multiproceso, surge la pregunta de por qué necesitamos el multiproceso.
Beneficios del subproceso múltiple
El subproceso múltiple tiene varios beneficios que ayudan a una programación eficiente.
Los puntos siguientes lo aclararán.
# 1) Uso eficiente de sistemas de CPU única
Cuando solo hay una CPU en el sistema, con un solo subproceso, se pierde el tiempo de la CPU. Cuando el hilo está ocupado usando otros recursos como IO, la CPU está inactiva. Podemos mejorar esto y utilizar mejor la CPU al tener aplicaciones multiproceso.
Mediante el uso de subprocesos múltiples, si un subproceso se realiza con CPU, entonces el otro subproceso puede utilizarlo. Con varios subprocesos, el tiempo de inactividad de la CPU se reducirá considerablemente.
# 2) Uso eficiente de múltiples sistemas de CPU
Al igual que las CPU individuales, incluso con sistemas que tienen varias CPU, las aplicaciones multiproceso pueden utilizar varias CPU de manera eficiente.
# 3) Experiencia de usuario mejorada con respecto a la capacidad de respuesta y la equidad
La capacidad de respuesta del sistema mejora con aplicaciones multiproceso. No experimentamos el 'GUI colgando' cuando tenemos varios subprocesos que realizan varias tareas en la aplicación y los usuarios no necesitan esperar mucho tiempo para obtener una respuesta a sus solicitudes.
Del mismo modo, los usuarios son servicios propiamente dichos en sistemas multiproceso.
Cómo implementar la concurrencia en Java
La primera clase con la que podemos implementar la concurrencia en Java es java.lang.Thread clase. Esta clase Thread forma la base de la concurrencia en Java.
También tenemos java.lang.Runnable interfaz que puede ser implementada por una clase Java para abstraer el comportamiento del hilo. Para el desarrollo de aplicaciones avanzadas, podemos hacer uso de la java.util.concurrent paquete disponible desde Java 1.5.
En el futuro, discutiremos la concurrencia en Java en detalle. Analicemos y comprendamos el concepto de subprocesos en Java en este tutorial. En nuestros tutoriales posteriores sobre subprocesos múltiples, exploraremos varios conceptos de subprocesos múltiples y concurrencia.
¿Qué es un hilo en Java?
Un solo hilo puede definirse como la unidad de procesamiento más pequeña y ligera. En Java, los subprocesos se utilizan en programas que utilizan la clase 'Subproceso'.
Los hilos de Java son de dos tipos:
# 1) Hilo de usuario: El hilo de usuario se crea cuando la aplicación se inicia por primera vez. Entonces podemos crear tantos hilos de usuario y demonio.
# 2) Hilo de demonio: Los subprocesos del demonio se utilizan principalmente en segundo plano y se utilizan para tareas como limpiar la aplicación, etc.
Los hilos reducen el costo de mantenimiento de la aplicación. También reduce la sobrecarga de la aplicación.
A continuación se muestra un ejemplo de un solo hilo:
|_+_|El programa anterior mostrará 'Este es un hilo', ya que cuando se inicia la aplicación se crea un hilo de usuario. En el programa anterior, la función principal es el punto de partida de la aplicación y crea un hilo de usuario.
El ciclo de vida de un hilo
El siguiente diagrama muestra el ciclo de vida de un hilo en Java.
Como se muestra en el diagrama anterior, un hilo en Java tiene los siguientes estados:
# 1) Nuevo: Inicialmente, el hilo que se acaba de crear a partir de la clase de hilo tiene un estado 'nuevo'. Aún no se ha iniciado. Este hilo también se llama 'Hilo nacido' .
# 2) Ejecutable: En este estado, la instancia de un hilo se invoca mediante el método 'comienzo' .
# 3) Corriendo: Se invoca el método de inicio de la instancia del hilo y el hilo comienza a ejecutarse. Este es el estado de ejecución. En su mayoría, el programador programa y administra los subprocesos.
# 4) Bloqueado: Hay varios subprocesos en una aplicación. Estos hilos tienen que esperar a otro ya que su ejecución debe estar sincronizada.
# 5) Terminado: Una vez que finaliza el proceso de ejecución del hilo, el hilo se termina o se detiene su ejecución.
Entonces, primero se crea un hilo, luego se programa y luego el programador lo ejecuta. Mientras que el hilo en ejecución puede bloquearse o suspenderse para alguna otra actividad. Luego se reanuda y mientras se completa el procesamiento, se ejecuta el hilo.
Prioridades de hilo
Una prioridad de subproceso decide cómo se tratará un subproceso con respecto a los otros subprocesos en una aplicación. Una prioridad de subproceso es un número entero.
A continuación se enumeran algunos puntos para recordar sobre las prioridades de los hilos:
- Las prioridades de los subprocesos son números enteros.
- Usando la prioridad de subprocesos, podemos decidir cuándo debemos cambiar de un subproceso en estado de ejecución a otro. Este es el proceso de cambio de contexto en el que cambiamos los contextos de los hilos.
- En cualquier momento, un hilo puede liberar voluntariamente su control sobre la CPU. Entonces el hilo con la prioridad más alta puede asumir el control.
- De manera similar, un subproceso de mayor prioridad puede adelantarse a cualquier otro subproceso con menor prioridad.
- La clase Thread proporciona un método setPriority () que se utiliza para establecer la prioridad para el hilo.
- También podemos usar las constantes MIN_PRIORITY, MAX_PRIORITY o NORM_PRIORITY en lugar de enteros.
Crear un hilo
Podemos crear un hilo usando cualquiera de las siguientes formas:
- Ampliación de la clase 'Thread' de Java.
- Implementando 'Runnable'.
Ampliación de la clase 'Thread' de Java
La clase 'Thread' contiene los constructores y métodos que nos permiten crear y realizar operaciones en un objeto thread. Internamente, la clase Thread implementa la interfaz Runnable y también extiende la clase Object.
La siguiente tabla ofrece un resumen de varios constructores y métodos de una clase Thread ().
Constructor/ | Prototipo | Descripción |
---|---|---|
dormir | Sueño vacío público (milisegundos largos) | La ejecución del hilo actual se detiene durante milisegundos especificados. |
Constructor de hilo () | Hilo() | Constructor predeterminado para crear un objeto Thread. |
Hilo (nombre de la cadena) | Constructor para crear un objeto Thread con un nombre especificado. | |
Hilo (ejecutable r) | Cree una instancia de Thread con el objeto de interfaz Runnable especificado. | |
Subproceso (Runnable r, nombre de cadena) | Cree una instancia de Thread con un objeto de interfaz Runnable especificado y un nombre de pila | |
correr | public void run () | El método Run realiza la acción para un hilo. Invoca el hilo. |
comienzo | inicio vacío público () | Se utiliza para iniciar la ejecución del hilo. Internamente, la JVM llama al método run () en este hilo. |
unirse | unión vacía pública () | Espera a que muera el hilo |
unión vacía pública (milisegundos largos) | Espere milisegundos especificados para que el hilo muera. | |
getPriority | public int getPriority () | Devuelve la prioridad del hilo |
fijar prioridad | public int setPriority (prioridad int) | Cambiar la prioridad del hilo a la prioridad especificada |
getName | public String getName () | devuelve el nombre del hilo. |
escoger un nombre | public void setName (nombre de cadena) | Establecer el nombre del hilo en una cadena especificada |
currentThread | hilo público currentThread () | Devuelve la referencia del hilo que está actualmente activo |
getId | public int getId () | Devolver ID de hilo |
getState () | public Thread.State getState () | Devuelve el estado actual del hilo |
isAlive | public boolean isAlive () | Compruebe si el hilo está vivo y devuélvalo verdadero si es así. |
producir | rendimiento de vacío público () | Pausa temporalmente el hilo actual y permite que se ejecuten otros hilos. |
isDaemon | isDaemon booleano público () | Compruebe si el hilo es un hilo demonio; devuelva verdadero si es así. |
setDaemon | public void setDaemon (booleano b) | Establezca el hilo como un hilo demonio si b = true; más establecido como hilo de usuario. |
interrumpir | interrupción de vacío público () | Interrumpe el hilo actual. |
isInterrupted | public boolean isInterrupted () | Compruebe si el hilo está interrumpido. |
interrumpido | public static boolean interrumpido () | Compruebe si se ha interrumpido el hilo actual. |
dumpStack | Vacío estático dumpStack () | Imprime un seguimiento de la pila del hilo actual en el flujo de error estándar. |
suspender | suspensión de vacío público () | Suspende todos los hilos. (** el método está obsoleto en las últimas versiones de Java) |
reanudar | curriculum vitae vacío público () | Reanudar hilo suspendido. (** el método está obsoleto en las últimas versiones de Java) |
detener | parada de vacío público () | Detiene el hilo. (** el método está obsoleto en las últimas versiones de Java) |
Desarrollaremos estos métodos de subprocesos en nuestro próximo tutorial sobre subprocesos múltiples.
Comenzando un hilo
El método start () que se utiliza para iniciar el hilo realiza los siguientes pasos:
- Inicia una nueva instancia de subproceso con un nuevo CallStack.
- El estado del hilo cambia de nuevo a ejecutable.
- Cuando es el turno del hilo, ejecuta el método run ().
Implementación de la interfaz 'ejecutable'
También se puede crear una instancia de subproceso utilizando la interfaz Runnable. Para crear una instancia de hilo, la clase cuyos objetos deberían ser ejecutados por un hilo debería implementar la interfaz Runnable.
La interfaz Runnable tiene un solo método:
|_+_|Ejemplo de clase de subproceso
Ahora demostremos el hilo en Java usando la clase hilo.
|_+_|Producción
Hilo de Java con interfaz ejecutable
El siguiente ejemplo demuestra el uso de la interfaz Runnable para crear una instancia de subproceso.
|_+_|Producción
Cómo detener un hilo en Java
Hemos visto los ejemplos de hilos anteriores. De estos ejemplos, sabemos que cuando el método de ejecución finaliza la ejecución, el hilo se detiene o también se detiene debido a algunas excepciones.
Las versiones anteriores de Java tenían un método stop () en la clase Thread que podía usarse para detener directamente el hilo. Pero ahora se ha desaprobado por razones de seguridad. Por lo tanto, necesitamos emplear los otros métodos para detener el hilo que se está ejecutando.
Hay dos métodos que podemos emplear para detener el hilo.
- Usando una variable booleana volátil
- Usando interrupciones.
En esta sección, discutiremos estos dos métodos para detener un hilo.
Usando una variable booleana volátil
En este método, mantenemos una variable booleana, digamos bandera, para detener el hilo. El subproceso se ejecuta siempre que la variable booleana se establezca en verdadero. En el momento en que se vuelve falso, el hilo se detiene.
La especialidad de este método es que declaramos la variable booleana como ' volátil ”Para que siempre se lea desde la memoria principal y el programa no pueda almacenarlo en la memoria caché de la CPU. De esta forma, no habrá ninguna diferencia en los valores establecidos y leídos.
La implementación de detener un hilo usando una variable booleana volátil se muestra a continuación.
|_+_|Producción
Nota: Aquí hemos mostrado solo una parte del resultado. El hilo puede durar varios minutos antes de detenerse. Para que podamos obtener diferentes resultados en diferentes sistemas.
Usar interrupciones
Aquí, el hilo se detiene usando el método interrupt () como ya discutimos anteriormente en los métodos de clase de hilo. El método interrupt () establece el estado del hilo como interrumpido. Este estado se pasa al ciclo while del método run (). Podemos obtener el estado interrumpido usando el método interrumpido ().
El siguiente programa demuestra el uso del método interrupt () para detener el hilo.
|_+_|Producción
Preguntas frecuentes
P # 1) ¿Por qué usamos Multithreading en Java?
Responder: El subproceso múltiple permite la ejecución simultánea o simultánea de dos o más subprocesos en una aplicación. La ejecución concurrente maximiza el rendimiento y también utiliza la CPU al máximo.
P # 2) ¿Qué es el multiproceso? ¿Cuáles son sus tipos?
Responder: El multihilo significa ejecutar más de un hilo. Esta ejecución puede ser concurrente o paralela. Por lo tanto, el subproceso múltiple tiene dos tipos, es decir, concurrente o paralelo.
P # 3) ¿Qué es el multiproceso frente al multiprocesamiento?
Responder: En el subproceso múltiple, hay varios subprocesos para el mismo o diferentes procesos y estos subprocesos se ejecutan al mismo tiempo para mejorar la velocidad de cálculo de un sistema. En el multiprocesamiento, un sistema tiene más de dos CPU y varios procesos se ejecutan simultáneamente.
P # 4) ¿Cuáles son las ventajas de Multithreading en Java?
Responder: Utilizando subprocesos múltiples podemos ejecutar diferentes partes de una aplicación simultáneamente usando subprocesos. El subproceso múltiple aumenta el rendimiento del sistema. El subproceso múltiple también maximiza la utilización de la CPU, ya que diferentes subprocesos utilizan continuamente la CPU.
los mejores lugares para ver anime gratis
P # 5) ¿Es el subproceso múltiple bueno para los juegos?
Responder: Sí, especialmente para juegos modernos.
Conclusión
Se trata de la introducción de subprocesos múltiples. Hemos discutido la concurrencia y los subprocesos múltiples en Java en este tutorial. Discutimos la creación de un hilo con la clase Thread, así como la interfaz Runnable y hemos proporcionado ejemplos apropiados.
También hemos aprendido los conceptos de un solo hilo y su creación en detalle. En este tutorial se han analizado los conceptos de hilo, incluido el ciclo de vida de un hilo, detener un hilo, tipos de hilo, etc.
También discutimos el multihilo en profundidad y la concurrencia en Java. Al final de este tutorial, el lector debería poder comprender fácilmente los conceptos de concurrencia y subprocesos múltiples y también subprocesos en Java.
=> Tenga cuidado con la serie de capacitación simple de Java aquí.
Lectura recomendada
- Multithreading en C ++ con ejemplos
- Hilos de Java con métodos y ciclo de vida
- Thread.Sleep () - Método Thread Sleep () en Java con ejemplos
- Tutorial de JAVA para principiantes: más de 100 tutoriales prácticos en vídeo de Java
- Tutorial de reflexión de Java con ejemplos
- Tutorial del método Java String contains () con ejemplos
- Matriz irregular en Java - Tutorial con ejemplos
- Tutorial de la clase Java Scanner con ejemplos