Cargando



Programación Multitarea o Multihilos con Java

Explicando a fondo en qué consiste la multitarea y multihilos con el lenguaje de programación Java y ejemplos practicos.


feb 22 2015 15:21
Avanzado
Cuando programamos un software debemos tener en cuenta el tiempo de ejecución y las distintas tareas que realiza el usuario para que no sean demasiado lentas, en algunos casos se ha utilizado pantallas para distraer al usuario con mensajes como "Cargando…" "El proceso puede tardar varios minutos…" y otros mensajes conocidos.

La mayoría de las veces el software utiliza toda la memoria ram y la cpu bloqueando otras tareas o incluso tildando por completo el ordenador. Esto se produce porque el proceso se ejecuta en primer o segundo plano consumiendo todos los recursos y bloqueando los demás procesos. Una manera de solucionar este problema es utilizando la multitarea, aprovechando que los ordenadores tienen más de un procesador. Si programamos nuestra aplicación con métodos de multitarea el ordenador no quedara bloqueado aunque si más lento pero el usuario podrá seguir ejecutando otra aplicación, ya que los procesadores pueden responder a distintas hilos ejecutando en paralelo.

Un Hilo o Thread es una parte del código que tiene la característica de ser ejecutado en forma paralela es decir al mismo tiempo que otra parte del código. También tiene la limitación del hardware ya que la multitarea depende de la cantidad de núcleos que tenga el procesador, es decir si tiene 2 núcleos podrá ejecutar dos tareas al mismo tiempo .
Existen dos planos de ejecución para un software el primer plano y el segundo plano

El Primer plano o Foreground, es lo que el usuario ve en su pantalla, que trabaja con botones, ventanas, campos de texto, imágenes, etc. Los cálculos mas comunes se realizan en el primer plano o hilo principal de la aplicación. Aquí debemos tener en cuenta que si tenemos un diseño muy pesado con demasiada gráfica, el usuario puede sentir que la aplicación es lenta y no se debe a la multitarea sino a los recursos que consume para mostrar cada pantalla.

Actualmente muchos software advierten si una aplicación consume demasiados recursos o pone en peligro la estabilidad del sistema y otros directamente cierran la aplicación que causa problemas como por Android, donde en caso que un programa o software bloquea el dispositivo por màs de 5 segundos, lanza un mensaje de advertencia o en el peor de los casos el programa se cerrará informando que la aplicación se ha detenido. En Firefox si una web se ponen muy lenta también suelen aparecer mensajes de advertencia script no responde o Forzar cierre.

El Segundo plano o Background, aquí es donde se procesan los hilos o la multitarea. Mientas se muestra alguna pantalla, en el segundo plano deberíamos ejecutar todos los procesos pesados, aquí el usuario no ve lo que ocurre, es donde se ejecutan los servicios de software, los enlaces de red, los conexiones a bases de datos, los cálculos complejos, etc. Aquí los procesos pueden tardar el tiempo que necesiten mientras el usuario realiza otras tareas.


Como crear una aplicación multihilos

El primer método de crear un hilo es extender la clase Thread que ya existe en Java y luego añadir el código que queramos ejecutar dentro del método run()
class Miaplicacion extends Thread {

    public void run() {
   // Proceso a ejecutar

  }
  System.out.println("Este proceso Finalizado");

       }
Esta calse que hemos definido Miaplicacion que extiende de la clase Thread y utiliza el método run() para dar la funcionalidad de ejecución en esta clase. Extendiendo la clase Thread, se pueden heredar los métodos y variables de la clase padre.

Iniciar un Thread o hilo

Las aplicaciones Java ejecutan el método main() al iniciarse, allí es donde veremos inciar también los hilos necesarios para nuestra aplicación salvo que necesitemos por requerimientos que algún evento los ponga en funcionamiento.

Por ejemplo supongamos tenemos una clase que extiende de Thread y creamos nuevos hilo y los iniciamos
public static void main(String[] args) {

  Clasehilo hiloA = new Clasehilo("Hilo A");

  Clasehilo hiloB = new Clasehilo("Hilo B");
  

  hiloA.start();
  hiloB.start();

}
Los valores que asignamos a cada hilo conforman el nombre de cada hilo o thread a iniciarse.

Suspender la ejecución de un hilo o Thread

Podemos necesitar detener la ejecución del hilo si necesitamos realizar alguna otra tarea para continuarla luego para ello se utiliza el método suspend(), se puede reanudar con el método start().
hilo.suspend();
Detener la ejecución de un hilo o Thread

Mediante el método stop() podemos detener la ejecución del hilo, hay que tener en cuenta que no se puede reanudar con el método start(). Cuando se desasignen las variables que se usan en el thread, el objeto thread (creado con new) quedará marcado para eliminarlo y el garbage collector se encargará de liberar la memoria que utilizaba.
hilo.stop();
También podemos necesitar determinar si un thread o hilo continua funcionado por más que haya terminado el proceso que se le asigno para ello podemos usar el método isAlive().
hilo.isAlive();
Veamos un ejemplo de una aplicación multihilos desarrollado con Netbeans, comenzaremos por crear una aplicación.


programacion-multitarea-java.jpg



Le asignamos un nombre a nuestro proyecto en este caso Hilo al iniciar la clase hilo.java tendremos el método main por defecto
package hilos;

public class Hilos {

    public static void main(String[] args) {

        // All code application logic here
  

             }
   

}
Ahora procederemos a añadir una clase que sera la que procese nuestros hilos, vamos a suponer que tenemos tres áreas de una empresa área Clientes, área de Pagos y área de Ventas y cada una debe procesar 20 operaciones ya sea de ventas o atención al cliente o pagos y todas deben ser procesadas por un servidor.

Crearemos entonces la clase que extiende de la clase Thread y se denominara Procesarhilo
package hilos;
public class Procesarhilo extends Thread  {

//la variable mensaje es un parámetro que le asignaremos el área que estamos procesando
String mensaje;

public Procesarhilo(String mensaje) {
  this.mensaje=mensaje;

}
//La funcion run ejecuta los hilos

    public void run()
{

  for(int i =1;i<=20;i++)
  {

   //Mostramos el área que se esta procesando
                                 System.out.println(mensaje+" "+i);

                        //Mostramos un aviso de que el hilo se termino de procesar
                        System.out.println("El proceso:"+" "+i+" finalizo");

  }
  }

    public void AsignarMensaje(String mensaje)
{

this.mensaje = mensaje;
}

}
Luego vamos a la clase main de hilos.java e instanciamos los hilos que serán procesados:


programacion-multitarea-java2.jpg



Luego ejecutamos el programa y veremos en la salida de texto como se van ejecutando los hilos el resultado será el siguiente:


programacion-multitarea-java3.jpg



Analicemos como se procesaron los hilos:

Proceso Área Cliente 1
Proceso Área Cliente 2
Proceso Área Cliente 3
Proceso Área Cliente 4
Proceso Área Cliente 5
Proceso Área Cliente 6
Proceso Área Cliente 7
…..
Proceso Área Cliente 16 - El proceso: 16 finalizó

Hasta el cliente 16 se proceso en forma secuencial pero aquí comienza el proceso de pagos
Proceso Área Pagos 1
….
Proceso Área Pagos 10
Hasta el proceso de pagos 10 se ejecuto y luego comienza el de Ventas
Proceso Área Ventas 1
...
Proceso Área Ventas 15
En el proceso 15 retoma el proceso de pago 11 hasta finalizar
Proceso Área Pagos 11
….

Proceso Área Pagos 20

Luego continua con el proceso de Clientes donde dejo y hasta finalizar
Proceso Área Cliente 17
….
Proceso Área Cliente 20
Proceso Área Ventas 16
Proceso Área Ventas 20


Finalmente concluye con todos los hilos retomando el proceso de ventas hasta finalizar, así podemos ver como las 60 tareas asignadas fueron ejecutándose no en forma secuencial sino tomando el control de los recursos por un breve periodo de tiempo para permitir que todas las tareas se ejecuten en multitarea.

¿Te ayudó este Tutorial?


1 Comentarios


Jhonatan Perez
mar 07 2017 16:24
Hola,si necesito hacer una app java de ordenamiento, utilisando dos hilos, uno que ordene por burbuja y otro por quilcksort, como pudiera yo meter en el metodo run, los dos metodos de ordenamiento?
No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X