8
ANÁLISIS Y PROGRAMACIÓN EN JAVA
Programación de
aplicaciones multitarea
ÍNDICE
8 8.1 8.2 8.3
Concepto de Clase Threads Multitarea en
tarea y e interfaz Java
multitarea Runnable
8.1 Concepto del
tarea y multitarea
C O M E N Z A R
Concepto de tarea y multitarea
Antes de introducir el concepto de multitarea, no
podíamos ejecutar más de una tarea en paralelo lo cual
era un inconveniente, para solucionar esto se introdujo
la clase Thread (hilo).
Un subproceso es un proceso muy liviano, es la parte más
pequeña del proceso que permite que un programa
funcione de manera eficiente al ejecutar múltiples tareas
simultáneamente.
Para realizar tareas complicadas en segundo plano, usamos el
concepto Thread en Java. Todas las tareas se ejecutan sin afectar al
programa principal. En un programa o proceso, todos los
subprocesos tienen su propia ruta separada para la ejecución, por lo
que cada subproceso de un proceso es independiente.
Concepto de tarea y multitarea
Todos los hilos comparten una
Otro beneficio de usar hilos es que memoria común y tienen su propia
si un hilo obtiene una excepción o pila, variables locales y contador
de programa. Cuando varios
un error en el momento de su subprocesos se ejecutan en
ejecución, no afecta a la ejecución paralelo al mismo tiempo, este
proceso se conoce como
de los otros hilos. subprocesos múltiples.
Concepto de tarea y multitarea
Un Thread es:
Una utilidad a través de la cual podemos realizar
múltiples actividades dentro de un solo proceso.
Un proceso ligero.
Una serie de sentencias ejecutadas.
Una secuencia anidada de llamadas a métodos.
Concepto de tarea y multitarea
Modelo Thread
1 New. Un subproceso está en New cuando obtiene
tiempo de CPU.
New
2 Running. Un subproceso está en estado Running
cuando está en ejecución. sleep done, I/O, complete,
lock available, resume, notify
Runnable
Suspended. Un subproceso está en estado
3 Non-Runnable
Suspended cuando está temporalmente inactivo o
en ejecución. (Blocked)
Running
sleep, block on I/O, wait for
4 Blocked. Un subproceso está en estado Blocked
run() method lock, suspend, wait
cuando está esperando recursos.
exits
Terminated. Un hilo entra en este estado cuando, en Terminated
5
un momento dado, detiene su ejecución
inmediatamente.
8.2 Clase Threads e
interfaz
Runnable
C O M E N Z A R
Clase Threads e interfaz Runnable
Un subproceso se crea ya sea "creando o
implementando" la interfaz Runnable o
extendiendo la clase Subproceso.
Estas son las dos únicas formas a través de las
cuales podemos crear un hilo de forma aislada y
explícita, también puede utilizarse un pool de hilos
para lo cual existen diferentes implementaciones
que no son objeto de esta unidad.
Crear un hilo
Clase Threads e interfaz Runnable
Clase Threads
Una clase Thread tiene varios métodos y constructores que nos permiten realizar varias
operaciones en un hilo.
La clase Thread amplía la clase Object.
La clase Object implementa la interfaz Runnable.
Constructores
Thread() Thread(Runnable, String name) Thread(Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target) Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Clase Threads e interfaz Runnable
Runnable Interface (run() method)
Se requiere que la interfaz Runnable sea implementada por esa clase cuyas instancias están
destinadas a ser ejecutadas por un hilo.
La Runnable Interface nos proporciona el método run() para realizar una acción para el subproceso.
start() method
Se utiliza para iniciar un hilo que hemos creado recientemente. Comienza un nuevo hilo con una
nueva pila de llamadas. Después de ejecutar el método start(), el subproceso cambia el estado de
New a Runnable.
Ejecuta el método run() cuando el hilo obtiene el tiempo correcto para ejecutarlo.
Clase Threads e interfaz Runnable
Subproceso Java extendiendo la clase Thread
Ejemplo 1
// Implementing runnable interface by extending Thread class
public class ThreadExample1 extends Thread {
// run() method to perform action for thread.
public void run()
{
int a= 10;
int b=12;
int result = a+b;
[Link]("Thread started running..");
[Link]("Sum of two numbers is: "+ result);
}
public static void main( String args[] )
{
// Creating instance of the class extend Thread class
ThreadExample1 t1 = new ThreadExample1();
//calling start method to execute the run() method of the Thread class
[Link]();
} SALIDA
}
Clase Threads e interfaz Runnable
Ejemplo 1
// Implementing runnable interface by extending Thread class
public class ThreadExample1 extends Thread {
// run() method to perform action for thread.
public void run()
{
int a= 10;
int b=12;
int result = a+b;
[Link]("Thread started running..");
[Link]("Sum of two numbers is: "+ result);
}
public static void main( String args[] )
{
// Creating instance of the class extend Thread class
ThreadExample1 t1 = new ThreadExample1();
//calling start method to execute the run() method of the Thread class
[Link]();
} SALIDA
}
Clase Threads e interfaz Runnable
Crear hilos mediante la implementación de interfaz Runnable
En Java, también podemos crear un
hilo implementando la interfaz
ejecutable. La interfaz ejecutable nos
proporciona tanto el método run()
como el método start().
Clase Threads e interfaz Runnable
class NewThread implements Runnable {
String name;
Ejemplo 2
Thread thread;
NewThread (String name){
[Link] = name; class ThreadExample2 {
thread = new Thread(this, name); public static void main(String args[]) {
[Link]( "A New thread: " + thread+ "is created\n" ); new NewThread("1st");
[Link](); new NewThread("2nd");
} new NewThread("3rd");
public void run() { try {
try { [Link](8000);
for(int j = 5; j > 0; j--) { } catch (InterruptedException excetion) {
[Link](name + ": " + j); [Link]("Inturruption occurs in Main Thread");
[Link](1000); }
} [Link]("We are exiting from Main Thread");
}catch (InterruptedException e) { }
[Link](name + " thread Interrupted"); }
}
[Link](name + " thread exiting.");
} SALIDA
}
Clase Threads e interfaz Runnable
class NewThread implements Runnable {
String name;
Ejemplo 2
Thread thread;
NewThread (String name){
[Link] = name; class ThreadExample2 {
thread = new Thread(this, name); public static void main(String args[]) {
[Link]( "A New thread: " + thread+ "is created\n" ); new NewThread("1st");
[Link](); new NewThread("2nd");
} new NewThread("3rd");
public void run() { try {
try { [Link](8000);
for(int j = 5; j > 0; j--) { } catch (InterruptedException excetion) {
[Link](name + ": " + j); [Link]("Inturruption occurs in Main Thread");
[Link](1000); }
} [Link]("We are exiting from Main Thread");
}catch (InterruptedException e) { }
[Link](name + " thread Interrupted"); }
}
[Link](name + " thread exiting.");
} SALIDA
}
8.3 Multitarea en
Java
C O M E N Z A R
Multitarea en Java
Multitarea
La Multitarea (o multihilos) nos permite
ejecutar varios procesos a la vez, lo que
permite realizar programas eficientes y que se
ejecutan en menos tiempo.
Multitarea en Java
Ve nt a j a s :
Los subprocesos múltiples en Java ayudan a realizar múltiples operaciones al mismo tiempo sin bloquear al usuario.
Puede realizar numerosas tareas juntas, por lo que los subprocesos múltiples en Java ahorran tiempo.
Todos los subprocesos son independientes, por lo que no influye en los diferentes subprocesos, suponiendo que en cualquier caso se
produzca una excepción en un solo subproceso.
Los subprocesos múltiples en Java permiten que el programa se ejecute de manera persistente, independientemente de si una parte
del mismo está impedida o bloqueada.
Los subprocesos múltiples en Java mejoran el rendimiento general en comparación con los programas paralelos convencionales que
utilizan múltiples procesos.
Los subprocesos múltiples en Java nos permiten crear programas efectivos que utilizan el tiempo máximo de CPU.
Funciona en la capacidad de respuesta de aplicaciones o programas complejos.
Aumenta la utilización de los recursos de la CPU y reduce el costo de mantenimiento.
Los subprocesos múltiples en Java ahorran tiempo.
Suponiendo que se produzca una excepción en un solo subproceso, los subprocesos múltiples en Java no influirán en las diferentes
cadenas, ya que todas las cadenas son autónomas.
Multitarea en Java
Hay 2 tipos de multitarea en Java:
Multitarea basada en procesos: más de 1 proceso se ejecuta simultáneamente.
Por ejemplo: ejecutar una hoja de cálculo de Excel mientras se ejecuta un
procesador de textos.
Multitarea basada en subprocesos: más de 1 subproceso se ejecuta
simultáneamente. Un hilo ejecuta diferentes partes del mismo programa.
Por ejemplo: Dar formato a un texto en un procesador de textos e imprimirlo al
mismo tiempo. Aunque cada subproceso tiene una ruta de ejecución diferente
para el mismo proceso, todos los subprocesos comparten el mismo recurso y
memoria.
Multitarea en Java
Si por ejemplo tenemos un programa en el que se tienen que ejecutar 4
procesos, si esto se hace de manera secuencial, uno detrás de otro:
Main PROCESO 1 PROCESO 2 PROCESO 3 PROCESO 4
Thread (5 segundos) (15 segundos) (10 segundos) (25 segundos)
El programa tardará en ejecutarse 55 segundos.
Multitarea en Java
La multitarea nos va a permitir que en lugar de realizarse el proceso de manera secuencial se haga a través de 4 hilos y
de esta manera se reduce el tiempo de ejecución.
Para ello es imprescindible que sepamos el número de procesos que se pueden lanzar en paralelo de manera eficiente.
Thread PROCESO 1
1 (5 segundos)
Thread PROCESO 2
Main
(15 segundos)
2
Thread
Thread PROCESO 3
3 (10 segundos)
Thread PROCESO 4
2 (25 segundos)
De esta manera se puede reducir el tiempo del proceso.
hemos
terminado
¡EXCELENTE TRABAJO!