subprocesos mĂșltiples en Java
Cualquier aplicaciĂłn puede tener mĂșltiples procesos (instancias). Cada uno de estos procesos puede asignarse como un Ășnico subproceso o como varios subprocesos. En este tutorial veremos cĂłmo realizar mĂșltiples tareas al mismo tiempo y tambiĂ©n aprenderemos mĂĄs sobre subprocesos y sincronizaciĂłn entre subprocesos.
ÂżQuĂ© es un hilo Ășnico?
Un solo hilo en Java Es bĂĄsicamente una unidad de procesamiento liviana y la mĂĄs pequeña. Java utiliza subprocesos mediante una âClase de subprocesoâ. Hay dos tipos de subprocesos: hilo de usuario y hilo de demonio (Los subprocesos de demonio se utilizan cuando queremos limpiar la aplicaciĂłn y se utilizan en segundo plano). Cuando se inicia una aplicaciĂłn por primera vez, se crea un subproceso de usuario. DespuĂ©s de eso, podemos crear muchos subprocesos de usuario y subprocesos de demonio.
Ejemplo de hilo Ășnico:
package demotest;
public class GuruThread
{
public static void main(String[] args) {
System.out.println("Single Thread");
}
}
Ventajas del hilo Ășnico:
- Reduce la sobrecarga en la aplicaciĂłn ya que se ejecuta un solo subproceso en el sistema.
- AdemĂĄs, reduce el coste de mantenimiento de la aplicaciĂłn.
ÂżQuĂ© es el subproceso mĂșltiple en Java?
multihilo in Java Es un proceso de ejecuciĂłn simultĂĄnea de dos o mĂĄs subprocesos para aprovechar al mĂĄximo la CPU. Las aplicaciones multiproceso ejecutan dos o mĂĄs subprocesos que se ejecutan simultĂĄneamente. Por lo tanto, tambiĂ©n se lo conoce como concurrencia. Java. Cada hilo corre paralelo entre sĂ. Varios subprocesos no asignan un ĂĄrea de memoria separada, por lo que ahorran memoria. AdemĂĄs, el cambio de contexto entre subprocesos lleva menos tiempo.
Ejemplo de hilo mĂșltiple:
package demotest;
public class GuruThread1 implements Runnable
{
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
Ventajas del multiproceso:
- Los usuarios no estĂĄn bloqueados porque los hilos son independientes y podemos realizar mĂșltiples operaciones a la vez.
- Como tal, los subprocesos son independientes, los otros subprocesos no se verĂĄn afectados si un subproceso cumple con una excepciĂłn.
Ciclo de vida del hilo en Java
El ciclo de vida de un hilo:

Hay varias etapas del ciclo de vida del hilo, como se muestra en el diagrama anterior:
- New
- Ejecutable
- Correr
- Esperando
- Muertos
- Nuevo: En esta fase, el hilo se crea utilizando la clase "Clase de hilo". Permanece en este estado hasta que el programa comienza la amenaza. También se le conoce como hilo nacido.
- Ejecutable: En esta pågina, la instancia del hilo se invoca con un método de inicio. El control del hilo se le da al programador para finalizar la ejecución. Depende del programador si se debe ejecutar el hilo.
- Corriendo: Cuando el hilo comienza a ejecutarse, el estado cambia al estado "en ejecuciĂłn". El programador selecciona un subproceso del grupo de subprocesos y comienza a ejecutarse en la aplicaciĂłn.
- Esperando: Este es el estado en el que un subproceso debe esperar. Como hay varios subprocesos ejecutĂĄndose en la aplicaciĂłn, es necesario que haya sincronizaciĂłn entre ellos. Por lo tanto, un subproceso debe esperar hasta que se ejecute el otro. Por lo tanto, este estado se denomina estado de espera.
- Muerto: Este es el estado en el que finaliza el hilo. El hilo estĂĄ en estado de ejecuciĂłn y tan pronto como completa el procesamiento, estĂĄ en "estado muerto".
Métodos de multiprocesamiento en Java
Algunos de los mĂ©todos comĂșnmente utilizados para subprocesos son:| MĂ©todo | Mareas Ideales para Lecciones |
|---|---|
| comienzo() | Este método inicia la ejecución del hilo y JVM llama al método run() en el hilo. |
| Dormir (int milisegundos) | Este método hace que el subproceso se suspenda, por lo que su ejecución se pausarå durante los milisegundos que se indiquen y, luego, el subproceso comenzarå a ejecutarse nuevamente. Esto ayuda a sincronizar los subprocesos. |
| getName () | Devuelve el nombre del hilo. |
| establecerPrioridad(int nuevaprioridad) | Cambia la prioridad del hilo. |
| producir () | Hace que el hilo actual se detenga y se ejecuten otros hilos. |
Ejemplo: En este programa multiproceso en Java Por ejemplo, vamos a crear un hilo y explorar los métodos integrados disponibles para los hilos.
package demotest;
public class thread_example1 implements Runnable {
@Override
public void run() {
}
public static void main(String[] args) {
Thread guruthread1 = new Thread();
guruthread1.start();
try {
guruthread1.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
guruthread1.setPriority(1);
int gurupriority = guruthread1.getPriority();
System.out.println(gurupriority);
System.out.println("Thread Running");
}
}
ExplicaciĂłn del cĂłdigo:
- Code LĂnea 2: Estamos creando una clase "thread_Example1" que implementa la interfaz Runnable (debe ser implementada por cualquier clase cuyas instancias estĂ©n destinadas a ser ejecutadas por el hilo).
- Code LĂnea 4: Anula el mĂ©todo de ejecuciĂłn de la interfaz ejecutable, ya que es obligatorio anular ese mĂ©todo.
- Code LĂnea 6: AquĂ hemos definido el mĂ©todo principal en el que iniciaremos la ejecuciĂłn del hilo.
- Code LĂnea 7: AquĂ estamos creando un nuevo nombre de hilo como "guruthread1" al crear una instancia de una nueva clase de hilo.
- Code LĂnea 8: Usaremos el mĂ©todo "inicio" del hilo usando la instancia "guruthread1". AquĂ el hilo comenzarĂĄ a ejecutarse.
- Code LĂnea 10: AquĂ estamos usando el mĂ©todo "dormir" del hilo usando la instancia "guruthread1". Por lo tanto, el hilo dormirĂĄ durante 1000 milisegundos.
- Code 9-14: Aquà hemos puesto el método de suspensión en el bloque try catch ya que se produce una excepción marcada, es decir, una excepción interrumpida.
- Code LĂnea 15: AquĂ estamos configurando la prioridad del hilo en 1, cualquiera que sea la prioridad que tuviera.
- Code LĂnea 16: AquĂ obtenemos la prioridad del hilo usando getPriority()
- Code LĂnea 17: AquĂ estamos imprimiendo el valor obtenido de getPriority
- Code LĂnea 18: AquĂ estamos escribiendo un texto que el hilo se estĂĄ ejecutando.
Cuando ejecuta el cĂłdigo anterior, obtiene el siguiente resultado:
Salida:
5 es la prioridad del subproceso y el subproceso en ejecuciĂłn es el texto que es el resultado de nuestro cĂłdigo.
Java Hilo SynchronizaciĂłn
En el subprocesamiento mĂșltiple, existe un comportamiento asincrĂłnico de los programas. Si un subproceso escribe datos y otro subproceso los lee al mismo tiempo, puede generarse una inconsistencia en la aplicaciĂłn. Cuando es necesario que dos o mĂĄs subprocesos accedan a los recursos compartidos, se utiliza el enfoque de sincronizaciĂłn. Java ha proporcionado mĂ©todos sincronizados para implementar un comportamiento sincronizado.
En este enfoque, una vez que el subproceso llega al interior del bloque sincronizado, ningĂșn otro subproceso puede llamar a ese mĂ©todo en el mismo objeto. Todos los subprocesos tienen que esperar hasta que ese subproceso finalice el bloque sincronizado y salga de Ă©l. De esta manera, la sincronizaciĂłn ayuda en una aplicaciĂłn multiproceso. Un subproceso tiene que esperar hasta que otro subproceso finalice su ejecuciĂłn y luego se permite la ejecuciĂłn de los demĂĄs subprocesos.
Se puede escribir de la siguiente forma:
Synchronized(object)
{
//Block of statements to be synchronized
}
subprocesos mĂșltiples en Java Programas de ejemplo
En este multihilo Java Por ejemplo, tomaremos dos hilos y buscaremos los nombres de los hilos.
Example1:
GuruThread1.java
package demotest;
public class GuruThread1 implements Runnable{
/**
* @param args
*/
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
ExplicaciĂłn del cĂłdigo:
- Code LĂnea 3: Hemos tomado una clase âGuruThread1â, que implementa Runnable (deberĂa ser implementada por cualquier clase cuyas instancias estĂ©n destinadas a ser ejecutadas por el hilo).
- Code LĂnea 8: Este es el mĂ©todo principal de la clase.
- Code LĂnea 9: AquĂ estamos creando una instancia de la clase Thread y creando una instancia denominada "guruThread1" y creando un hilo.
- Code LĂnea 10: AquĂ estamos creando una instancia de la clase Thread y creando una instancia llamada "guruThread2" y creando un hilo.
- Code LĂnea 11: Estamos iniciando el hilo, es decir, guruThread1.
- Code LĂnea 12: Estamos iniciando el hilo, es decir, guruThread2.
- Code LĂnea 13: Mostrar el texto como âLos nombres de los hilos son los siguientes:â
- Code LĂnea 14: Obtener el nombre del hilo 1 usando el mĂ©todo getName() de la clase de hilo.
- Code LĂnea 15: Obtener el nombre del hilo 2 usando el mĂ©todo getName() de la clase de hilo.
Cuando ejecuta el cĂłdigo anterior, obtiene el siguiente resultado:
Salida:
Los nombres de los hilos se muestran aquĂ como
- Guru1
- Guru2
Ejemplo 2:
En este subproceso mĂșltiple en Java Por ejemplo, aprenderemos cĂłmo anular los mĂ©todos run() y start() de una interfaz ejecutable y crearemos dos subprocesos de esa clase y los ejecutaremos en consecuencia.
AdemĂĄs, estamos tomando dos clases,
- Uno que implementarĂĄ la interfaz ejecutable y
- Otro que tendrå el método principal y se ejecutarå en consecuencia.
package demotest;
public class GuruThread2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GuruThread3 threadguru1 = new GuruThread3("guru1");
threadguru1.start();
GuruThread3 threadguru2 = new GuruThread3("guru2");
threadguru2.start();
}
}
class GuruThread3 implements Runnable {
Thread guruthread;
private String guruname;
GuruThread3(String name) {
guruname = name;
}
@Override
public void run() {
System.out.println("Thread running" + guruname);
for (int i = 0; i < 4; i++) {
System.out.println(i);
System.out.println(guruname);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread has been interrupted");
}
}
}
public void start() {
System.out.println("Thread started");
if (guruthread == null) {
guruthread = new Thread(this, guruname);
guruthread.start();
}
}
}
ExplicaciĂłn del cĂłdigo:
- Code LĂnea 2: AquĂ estamos tomando una clase âGuruThread2â, que contendrĂĄ el mĂ©todo principal.
- Code LĂnea 4: AquĂ estamos tomando un mĂ©todo principal de la clase.
- Code LĂnea 6-7: AquĂ estamos creando una instancia de la clase GuruThread3 (que se crea en las siguientes lĂneas de cĂłdigo) como âthreadguru1â y estamos iniciando el hilo.
- Code LĂnea 8-9: AquĂ estamos creando otra instancia de la clase GuruThread3 (que se crea en las siguientes lĂneas de cĂłdigo) como âthreadguru2â y estamos iniciando el hilo.
- Code LĂnea 11: AquĂ estamos creando una clase âGuruThread3â, que implementa la interfaz ejecutable (deberĂa ser implementada por cualquier clase cuyas instancias estĂ©n destinadas a ser ejecutadas por el hilo).
- Code LĂnea 13-14: Estamos tomando dos variables de clase de las cuales una es del tipo clase hilo y otra de clase cadena.
- Code LĂnea 15-18: estamos anulando el GuruEl constructor Thread3 toma un argumento de tipo cadena (que es el nombre del hilo) que se asigna a la variable de clase guruname y, por lo tanto, se almacena el nombre del hilo.
- Code LĂnea 20: AquĂ estamos anulando el mĂ©todo run() de la interfaz ejecutable.
- Code LĂnea 21: Estamos generando el nombre del hilo usando la declaraciĂłn println.
- Code LĂnea 22-31: AquĂ estamos usando un bucle for con el contador inicializado a 0, y no debe ser menor que 4 (podemos tomar cualquier nĂșmero, por lo tanto, aquĂ el bucle se ejecutarĂĄ 4 veces) e incrementamos el contador. Estamos imprimiendo el nombre del hilo y tambiĂ©n haciendo que el hilo entre en suspensiĂłn durante 1000 milisegundos dentro de un bloque try-catch ya que el mĂ©todo de suspensiĂłn generĂł una excepciĂłn marcada.
- Code LĂnea 33: AquĂ anulamos el mĂ©todo de inicio de la interfaz ejecutable.
- Code LĂnea 35: Estamos generando el texto "Hilo iniciado".
- Code LĂnea 36-40: AquĂ estamos tomando una condiciĂłn if para verificar si la variable de clase guruthread tiene valor o no. Si es nulo, entonces estamos creando una instancia usando una clase de subproceso que toma el nombre como parĂĄmetro (el valor se asignĂł en el constructor). DespuĂ©s de lo cual el hilo se inicia utilizando el mĂ©todo start().
Cuando ejecuta el cĂłdigo anterior, obtiene el siguiente resultado:
Resultado:
Hay dos hilos, por lo tanto, recibimos dos veces el mensaje "Hilo iniciado".
Obtenemos los nombres del hilo tal como los hemos generado.
Entra en el bucle for donde imprimimos el contador y el nombre del hilo y el contador comienza con 0.
El bucle se ejecuta tres veces y entre ellas el hilo permanece inactivo durante 1000 milisegundos.
Por lo tanto, primero obtenemos guru1, luego guru2 y luego nuevamente guru2 porque el hilo duerme aquĂ durante 1000 milisegundos y luego, a continuaciĂłn, guru1 y nuevamente guru1, el hilo duerme durante 1000 milisegundos, por lo que obtenemos guru2 y luego guru1.
Resumen
En este tutorial, vimos aplicaciones multiproceso en Java y cĂłmo utilizar hilos simples y mĂșltiples en Java.
- Explicar el multihilo en Java:En el subprocesamiento mĂșltiple, los usuarios no estĂĄn bloqueados ya que los subprocesos son independientes y pueden realizar mĂșltiples operaciones a la vez.
- Varias etapas del ciclo de vida del hilo son,
- New
- Ejecutable
- Correr
- Esperando
- Muertos
- También aprendimos sobre sincronización entre subprocesos, lo que ayuda a que la aplicación se ejecute sin problemas.
- ProgramaciĂłn multiproceso en Java facilita muchas mĂĄs tareas de aplicaciĂłn.



