La Sostenibilidad Corporativa. Administración Ambiental
Chap 15fpin
1. Multithreading
Objetivos
Entender el concepto de multithreading y
aplicarlo para desarrollar animaciones
Codificar hilos extendiendo la clase Thread
Codificar hilos implementando la interface
Runnable
Comprender el ciclo de vida de los estados
de un hilo y configurar sus propiedades
2. Multithreading
Objetivos
Usar la sincronización de hilos para evitar
conflicto con los recursos
Usar la clase Timer para simplificar el control
de la animación en Java.
3. Thread Concepts
Un hilo es un flujo de ejecución desde el
inicio hasta el fin de una tarea en un
programa.
4. Thread Concepts
Con Java, se puede lanzar múltiples hilos
concurrentemente desde un programa.
Estos hilos pueden ejecutarse
simultaneamente en un sistema con
multiples procesadores.
5.
6. Thread Concepts
En un sistema con un procesador simple
los múltiples hilos comparten tiempo de
CPU y el sistema operativo es
responsable de planificar y reservar los
recusos de este.
Esta organización es práctica debido a
que la mayoría del tiempo el CPU esta de
holgazán. Este no hace nada mientras
espera que el usuario ingrese datos.
7.
8. Thread Concepts
Los multihilos pueden hacer que su
programa responda mejor, sea interactivo,
así como tener mejor rendimiento.
Un buen procesador de palabras le debe
permitir imprimir o guardar un archivo
mientras UD. Escribe.
9. Thread Concepts
En muchos casos los programas con
múltiples hilos corren más rápido que un
programa con un simple hilo aún en los
sistemas con un sólo procesador.
Java provee un buen soporte excepcional
para la creación y ejecución de los hilos y
para ponerle cerrojos a los recursos para
prevenir conflictos
10. Thread Concepts
Cuando un programa se ejecuta como
una aplicación el intérprete de Java inicia
un hilo para el método main().
Cuando un programa se ejecuta como un
applet el navegador Web inicia un hilo
para correr el applet.
12. Thread Concepts
Cada nuevo hilo es un objeto de la clase
que implementa la interface Runnable o
extiende a la clase que implementa a la
interface Runnable.
Este nuevo objeto es referido como un
objeto runnable.
13. Thread Concepts
Ud. puede crear un hilo extendiendo la
clase Thread o implementando la interface
Runnable.
Ambos, Thread y Runnable están
definidos en el paquete java.lang
La clase Thread implementa a la interface
runnable
14. Creating Threads by the Thread
class
La clase Thread contiene los
constructores para crear los hilos así
como muchos métodos útiles para el
control de los hilos.
15. Creating Threads by the Thread
class
Para crear y correr un hilo, primero defina
una clase que extienda a la clase Thread
Su clase debe sobre escribir al método
run().
16. Creating Threads by the Thread
class
El método run() le dice a su sistema como
el hilo será ejecutado cuando este corra.
Ud. Puede entonces crear un objeto que
corra en el hilo.
17. //Custom thread class
public class CustomThread extends Thread
{
. . .
public CustomThread(…) { … }
//Override the run() method in Thread
public void run() {
//Tell system how to run custom thread
. . .
}
. . .
}
18. //Client class
public class Client
{
. . .
public someMethod (…) { …
//Create a Thread
CustomThread thread = new CustomThread(…);
// start() a Thread
thread.start();
. . .}
. . .
}
19. Using the Thread Class to
create and launch Threads
Problema: Escriba un programa para crear
y correr tres hilos
El primer hilo imprime la letra “a” cien veces
El segundo hilo imprime la letra “b” cien veces
El tercer hilo imprime los enteros desde 1
hasta 100
20. Using the Thread Class to
create and launch Threads
Solución: El programa crea tres hilos
independientes. Para correrlos
correctamente este necesita crear un
objeto runnable para cada hilo.
Debido a que los dos primeros hilos tienen
funcionalidad similar ellos pueden ser
definidos en una sola clase PrintChar que
extienda de Thread.
21. Using the Thread Class to
create and launch Threads
Solución: TestThread.java , PrintChar.java
y PrintNum.java
23. Creating Threads by
Implementing the Runnable
Interface
Este camino funciona bien si la clase
thread del usuario sólo hereda de la clase
Thread; pero no hereda de múltiples
clases como es el caso de un applet.
24. Creating Threads by
Implementing the Runnable
Interface
Para heredar de múltiples clases, se tiene
que implementar una interface
Java provee la interface Runnable como
alternativa de la clase Thread.
25. Creating Threads by
Implementing the Runnable
Interface
La interface Runnable contiene el método
run()
Se necesita implementar este método
para decirle al sistema como su hilo corre.
26. //Custom thread class
public class CustomThread implements Runnable
{
. . .
public CustomThread(…) { … }
//Override the run() method in Thread
public void run() {
//Tell system how to run custom thread
. . .
}
. . .
}
27. //Client class
public class Client
{ . . .
public someMethod (…) { …
//Create a Thread
CustomThread customThread = new CustomThread(…);
// Create a Thread
Thread thread = new Thread(customThread);
// start() a Thread
thread.start();
. . .}
. . .
}
28. Creating Threads by
Implementing the Runnable
Interface
Para iniciar un nuevo hilo con la interface
Runnable, se debe primero crear una
instancia de la clase que implementa la
interface Runnable, luego se usa el
constructor de la clase Thread para
construir el hilo.
31. Thread Controls and
communications
public void run() Este método es invocado
por el sistema java-runtime para ejecutar el
hilo. Se debe sobre escribir este método y
proveer el código que desea que el hilo
ejecute en su clase thread. Este método
nunca es invocado directamente por un
objeto runnable en un programa; sin embargo
este es un método de instancia del objeto
runnable.
32. Thread Controls and
communications
public void start() Inicia el hilo causando que
el método run() pueda ser invocado. Este
método es llamado por un objeto runnable en
la clase cliente.
33. Thread Controls and
communications
public void stop() Detiene el hilo. Apartir de
Java 2 este método es deprecated (obsoleto)
debido a que es conocido que por herencia
es inseguro. Se debe asignar null a una
variable de tipo Thread para indicar que este
hilo es detenido en lugar de utilizar el método
stop().
34. Thread Controls and
communications
public void suspend() Suspende el hilo. A
partir de Java 2 este método es deprecated
(obsoleto) es conocido que es deadlock-
prone ( propenso a estancamiento). Se debe
escribir un código para usar el método wait()
con una variable booleana para indicar
cuando un hilo esta suspendido en lugar de
usar el método obsoleto suspend().
35. Thread Controls and
communications
public void resume() Reanuda el hilo. Apartir
de Java 2 este método junto con suspend()
es deprecated debido a que es propenso a
estancamiento (deadlock). Se debe escribir el
código para usar el método notify() con una
variable booleana para indicar cuando un hilo
reanuda en lugar de usar el método obsoleto
deprecated resume().
36. Thread Controls and
communications
public static void sleep(long millis) throws
InterruptedException Pone el objeto runnable
a dormir por un tiempo especificado en
milisegundos. Observe que este método es
static.
37. Thread Controls and
communications
public static void yield(long millis) Causa que
el hilo que actualmente esta corriendo haga
una pausa temporal y permite que otros hilos
se ejecuten.
38. Thread Controls and
communications
public void interrupt() Interrumpe la ejecución
del hilo.
public static boolean isInterrupted() Verifica
cuando un hilo ha sido interrumpido.
39. Thread Controls and
communications
public boolean isAlive() Verifica si el hilo esta
corriendo actualmente.
public void setPriority(int p) Asigna la
prioridad p ( en un rango de 1 hasta 10) para
un hilo.
40. Thread Controls and
communications
Los métodos wait(), notify() y notifyAll()
son métodos de la clase Object.
Estos son frecuentemente usados con los
hilos para facilitar la comunicación entre
estos.
41. Thread Controls and
communications
public final void wait() throws
InterruptedException Fuerza al hilo a esperar
hasta que el método notify() o notifyAll() sea
invocado por el objeto para el cual wait() fue
llamado.
42. Thread Controls and
communications
public final void notify() Despierta uno de los
hilos que están esperando en este objeto.
Cual va a ser notificado depende de la
implementación del sistema.
public final void notifyAll() despierta todos los
hilos que están esperando por este objeto.
43. The Lifecycle of a Thread
new Thread
(born)
CPU
Blocked
blocked until
lock is
available
blocked
until
notified
runs to
completion
(dead)
Runnable
priority queues
start()
Thread
scheduler
synchronized
wait()
notify()
sleep(), join()
45. Thread Group
Un grupo thread es un conjunto de hilos.
Algunos programas contienen algunos
hilos con funcionalidad similar.
Por conveniencia estos se pueden
agrupar y realizar operaciones en todo el
grupo.
46. Thread Group
Por ejemplo se pueden suspender y
reanudar todos los hilos que pertenecen a
un grupo al mismo tiempo.
47. Guía para usarThread Group
1
Use el constructor ThreadGroup para
crear un grupo thread
ThreadGroup g = new ThreadGroup(“thread
group”);
Esto crea un grupo thread g con el nombre
“thread group”
El nombre es una cadena y debe ser único.
48. Guía para usarThread Group
2
Usando el constructor Thread, coloque el
hilo en un grupo de hilos:
Thread t = new Thread(g,
newThreadClass(),”This thread”);
49. Guía para usarThread Group
3
Para saber cuantos hilos de un grupo
están actualmente corriendo se usa el
método activeCount():
System.out.println(“The number of runnable
thread in the group “ + g.activeCount());
50. Guía para usarThread Group
4
Cada hilo pertenece a un grupo.
Por defecto un nuevo hilo creado es
miembro del grupo de hilo que lo creó.
51. Guía para usarThread Group
4
Para encontrar a que grupo de hilos
pertenece un hilo se usa el método
getThreadGroup()
Cada hilo se tiene que iniciar ya que no
existe un método start() en ThreadGroup