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:

Ciclo de vida del hilo en Java
Ciclo de vida del hilo en Java

Hay varias etapas del ciclo de vida del hilo, como se muestra en el diagrama anterior:

  1. New
  2. Ejecutable
  3. Correr
  4. Esperando
  5. Muertos
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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:

Ejemplo de hilo en Java

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:

Java Ejemplo de subprocesos mĂșltiples

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:

Ejemplo de subprocesos mĂșltiples en Java

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.

Resumir este post con: