clase 15 oop threads
TRANSCRIPT
-
8/10/2019 Clase 15 OOP Threads
1/44
-
8/10/2019 Clase 15 OOP Threads
2/44
Programacin orientada a Objeto - POO
2
Temario
Programacin Multithread
-
8/10/2019 Clase 15 OOP Threads
3/44
Programacin orientada a Objeto - POO
3
Qu es un thread?
Hasta el momento hemos desarrollado programas secuenciales conun nico thread: en cualquier instante durante la ejecucin de un
programa hay un nico punto de ejecucin.
Un threadUn Programa
-
8/10/2019 Clase 15 OOP Threads
4/44
-
8/10/2019 Clase 15 OOP Threads
5/44
Programacin orientada a Objeto - POO
5
Qu es un thread?
os no!edoso enthreads" es el uso de mltiples threads adentro deun mismo programa" ejecutndose simultneamente y reali#ando
tareas diferentes.
a plataforma $%&% soporta programas multhreading a tra!'s dellenguaje" de li(rer)as y del sistema de ejecucin.
-
8/10/2019 Clase 15 OOP Threads
6/44
-
8/10/2019 Clase 15 OOP Threads
7/44
Programacin orientada a Objeto - POO
7
Ejemplo
Output posibles:
-
8/10/2019 Clase 15 OOP Threads
8/44
-
8/10/2019 Clase 15 OOP Threads
9/44
Programacin orientada a Objeto - POO
9
Creacin de threads extendiendo la clasejava.lang.Thread.
El thread debe ser una clase que extiende la clase Thread !e debe sobreescribir el m"todo run() con el cdigo quedeber# ser e$ecutado por elthread.
Elthread debe ser lanado invocando el m"todo
start()del ob$eto %heredado de la clase Thread&
-
8/10/2019 Clase 15 OOP Threads
10/44
Programacin orientada a Objeto - POO
10
Creacin de threads extendiendo la clasejava.lang.Thread Ejemplo 1.
public class Hola extends Thread {
public void run() {for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
11/44
Programacin orientada a Objeto - POO
11
Creacin de threads extendiendo la clasejava.lang.Thread Ejemplo 1.
public class EjemploThreadSimple {
public static void main(String arg[]) {Hola h = new Hola();
Chao c = new Chao();
h.start();
c.start();
System.out.println( Fin programa );
}
}
'otar que para lanar un nuevo thread se debe invocar el m"todostart(). La simple invocacin del m"todo run()produce slo
su e$ecucin en el thread actual %como cualquier otro m"todo&.
-
8/10/2019 Clase 15 OOP Threads
12/44
Programacin orientada a Objeto - POO
12
Creacin de threads extendiendo la clasejava.lang.Thread Ejemplo 1.
public class EjemploThreadSimple {
public static void main(String arg[]) {
Hola h = new Hola();
Chao c = new Chao();
h.start();
c.start();System.out.println( Fin programa );
}
} Thread
Chao
Thread
Hola
Thread
Main
h.start();c.start();
-
8/10/2019 Clase 15 OOP Threads
13/44
Programacin orientada a Objeto - POO
13
Creacin de threads extendiendo la clasejava.lang.Thread Ejemplo 2.
-
8/10/2019 Clase 15 OOP Threads
14/44
Programacin orientada a Objeto - POO
14
Creacin de threads extendiendo la clasejava.lang.Thread Ejemplo 2.
-
8/10/2019 Clase 15 OOP Threads
15/44
Programacin orientada a Objeto - POO
15
Creacin de threads extendiendo la clasejava.lang.Thread Ejemplo 2.
-
8/10/2019 Clase 15 OOP Threads
16/44
Programacin orientada a Objeto - POO
16
Creacin de threads extendiendo la clasejava.lang. Runnable.
La clase que contiene el proceso que ser# lanado dentro deun nuevo thread debe implementar la interfa
java.lang.Runnable
)articularmente se debe implementar en la clase el m"todo
run()declarado enRunnable" con el cdigo que deber#ser e$ecutado por el thread
)ara lanar el thread se debe crear una instancia dejava.lang.Thread* pasando al constructor de "ste una
referencia al ob$eto que implementaRunnable* y luego sedebe invocar el m"todo start()del ob$eto Thread
-
8/10/2019 Clase 15 OOP Threads
17/44
Programacin orientada a Objeto - POO
17
Creacin de threads extendiendo la clasejava.lang. Runnable.
public class MiThread implements Runnable {
...
public void run() {
// cdigo del thread
}
...
}
...Thread t = new Thread( new MiThread() );
t.start();
...
*lase que implementa el cdigo del thread:
+nstanciacin y lan#amiento del thread:
-
8/10/2019 Clase 15 OOP Threads
18/44
Programacin orientada a Objeto - POO
18
Creacin de threads extendiendo la clasejava.lang. Runnable.
,jemplo de *lase que implementan Runnable :
public class Hola implements Runnable{
public void run() {
for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
19/44
Programacin orientada a Objeto - POO
19
Creacin de threads extendiendo la clasejava.lang.Runnable.
public class EjemploThreadSimple {
public static void main(String arg[]) {
Thread h = new Thread(new Hola());
Thread c = new Thread(new Chao());
h.start();
c.start();System.out.println( Fin programa );
}
}
%plicacin que lan#a los -hreads
'otar que para lanar un nuevo thread se debe crear una instancia de
Threadpasando al constructor una referencia a un ob$etoRunnable* einvocar el m"todostart()sobre +hread. La simple invocacin del m"todo
run()produce slo su e$ecucin en el thread actual %como cualquier otro
m"todo&.
-
8/10/2019 Clase 15 OOP Threads
20/44
Programacin orientada a Objeto - POO
20
Creacin de threads extendiendo la clasejava.lang.Runnable.
,jercicio
,rear un programa similar al e$emplo anterior que* en ve de usar clasesdistintas para mane$ar los threads correspondientes a los diferentes
mensa$es %-ola* -,hao/&* utilice dos thread de una misma clase %cuyo
mensa$e sea configurable&. aga una implementacin del thread extendiendo la clase Thready otraimplementando Runnable.
aga la aplicacin que lance los threads.
-
8/10/2019 Clase 15 OOP Threads
21/44
Programacin orientada a Objeto - POO
21
Creacin de threads extendiendo la clasejava.lang.Runnable.
olucin / &ersin que e0tiende Thread:
public class Habla extends Thread {
String mensaje;
public Habla(String msg){
mensaje = msg;
}
public void run() {
for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
22/44
Programacin orientada a Objeto - POO
22
Creacin de threads extendiendo la clasejava.lang.Runnable.
olucin / &ersin que implementa Runnable:
public class Habla implemens Runnable {
String mensaje;
public Habla(String msg){
mensaje = msg;
}
public void run() {for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
23/44
Programacin orientada a Objeto - POO
23
Mtodos tiles para la clase Threads: sleep Detiene la ejecucin del thread actual por la cantidad de
milisegundos indicada como parmetro.
public static void sleep(long millis) throws InterruptedException
public class MyThread extends Thread
{
...public void run() {
...
try{
sleep( 1000 );
}catch(InterruptedException e){
//Interrupcin}
...
}
}
,qui!alente:
Thread.sleep( 1000 );
NOTA:Si en vez de extender Thread sehubiese implementado Runnable,
entonces aqu hubiese sido necesaria
la referencia a la clase Thread parainvocar el mtodo sleep().
-
8/10/2019 Clase 15 OOP Threads
24/44
Programacin orientada a Objeto - POO
24
Mtodos tiles para la clase Threads: sleeppublic class Hola extends Thread {
public void run() {
for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
25/44
Programacin orientada a Objeto - POO
25
Mtodos tiles para la clase Threads: yield Detiene la ejecucin delthreadactual y permite a otrosthread
ser ejecutados.
public static void yield()
public class MyThread extends Thread {
...
public void run() {
...yield();
...
}
}
,qui!alente:
Thread.yield();
NOTA:Si en vez de extender Thread sehubiese implementado Runnable,
entonces aqu hubiese sido necesaria
la referencia a la clase Thread parainvocar el mtodo yield().
-
8/10/2019 Clase 15 OOP Threads
26/44
Programacin orientada a Objeto - POO
26
public class Hola extends Thread {
public void run() {
for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
27/44
Programacin orientada a Objeto - POO
27
Ciclo de vida de un Threads
P i i d Obj POO
-
8/10/2019 Clase 15 OOP Threads
28/44
Programacin orientada a Objeto - POO
28
Ciclo de vida de un Threads
Inicio de un thread 0 el thread se ha creado %-'uevo thread/& y se invoca el
m"todo start. El thread pasa al estado -e$ecutable/.
+ransicin del estado -e$ecutable/ al estado -no e$ecutable/. ocurre por uno de
estos tres motivos:
El thread invoca el m"todo sleep
El thread invoca el m"todo wait
El thread se bloquea en una operacin de I1O
P i i t d Obj t POO
-
8/10/2019 Clase 15 OOP Threads
29/44
Programacin orientada a Objeto - POO
29
Ciclo de vida de un Threads
+ransicin del estado -no e$ecutable/ a -e$ecutable/:
!i el thread hab2a invocado el m"todo sleep* el n3mero de milisegundos depausa ha transcurrido.
!i el thread hab2a invocado el m"todo wait de un ob$eto* otro thread lonotifica de continuar por llamando al m"todo
notifyo al m"todo
notifyAlldel
mismo ob$eto %4&
si el thread estaba bloqueado en operacin de I1O* la operacin se hacompletado
Programacin orientada a Objeto POO
-
8/10/2019 Clase 15 OOP Threads
30/44
Programacin orientada a Objeto - POO
30
Ciclo de vida de un Threads
+ransicin del estado -ejecutable/ al estado -muerto/: ocurre cuando el
m"todo run llega a su fin.
El m"todo isAlive ayuda a conocer el estado de un thread: 5etorna truesi el thread ha sido lanado %m"todo startinvocado& y no
detenido
5etornafalsesi el thread est# en el estado -Nuevo thread/ %no ha sidolanado& o est# -muerto/ %m"todo run terminado&
Programacin orientada a Objeto POO
-
8/10/2019 Clase 15 OOP Threads
31/44
Programacin orientada a Objeto - POO
31
Ejecucin de Threads)aralelismo:
En un sistema con m3ltiples ,)U* cada ,)U podr2a e$ecutar un thread distinto
,oncurrencia:
!i no es posible el paralelismo* una ,)U es responsable de e$ecutar m3ltiplesthreads
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
32/44
Programacin orientada a Objeto - POO
32
Ejecucin de Threads
Thread A
Thread B
Thread A
Thread B
CPU
Thread A Thread B
Thread A Thread B
Thread A Thread B
Thread A Thread B
CPU CPU
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
33/44
Programacin orientada a Objeto POO
33
Prioridades de Threads La e$ecucin de m3ltiples threads en una sola ,)U requiere
la determinacin de una secuencia de e$ecucin
%-scheduling/ &
Java soporta un algoritmo de secuenciacin de threadssimple denominado -fixed priority scheduling/
Este algoritmo secuencia la e$ecucin de threads en base ala -prioridad relativa/ que les ha sido asignada
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
34/44
Programacin orientada a Objeto POO
34
Prioridades de Threads ,uando se crea un nuevo thread* su prioridad relativa es la
misma que la del thread que lo cre
La prioridad de un thread puede ser cambiada en cualquiermomento por medio del m"todosetPriority. Este
m"todo recibe un entero que indica el valor de prioridad
%valores m#s altos indican m#s altas prioridades&
La clase +hread declara tres constantes: public static final int6789)5IO5I+;< public static final int6I'9)5IO5I+; public static final int'O569)5IO5I+=
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
35/44
g j
35
,l 5fi0ed priority scheduling6 de $a!a
Entre todos los threads en estado -ejecutable/ es
escogido el thread con la prioridad m#s alta
!i hay dos threads con la misma prioridad* es escogido unode ellos en modo round0robin
,uando el thread en e$ecucin pasa al estado -no
ejecutable/ o -muerto/ otro thread es seleccionadopara su e$ecucin.
La e$ecucin de un thread es interrumpida si otro thread conm#s alta prioridad se vuelve -ejecutable/.
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
36/44
g j
36
-hreads y la porta(ilidad de $a!a: de(ilidades
La responsabilidad de e$ecucin de los threads es pasada alsistema operativo.
>istintos sistemas operativos mane$an los threads en distintaforma: por e$emplo '+ y !olaris tienen diferentes niveles de
prioridades %incluso diferentes respecto los que define Java&
Existen sistemas operativos que implementan -time slicing/%subdivisin de tiempo&: el sistema operativo asigna unaporcin de tiempo a la e$ecucin de cada thread. En este
caso la e$ecucin de un thread es interrumpida no slo si
otro thread con m#s alta prioridad se vuelve -e$ecutable/*sino tambi"n cuando su tiempo asignado de e$ecucin se
acaba.
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
37/44
37
-hreads y la porta(ilidad de $a!a: de(ilidades
La responsabilidad de e$ecucin de los threads es pasada alsistema operativo.
>istintos sistemas operativos mane$an los threads en distintaforma: por e$emplo '+ y !olaris tienen diferentes niveles de
prioridades %incluso diferentes respecto los que define Java&
Existen sistemas operativos que implementan -time slicing/%subdivisin de tiempo&
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
38/44
38
-hreads y la porta(ilidad de $a!a: de(ilidades
el sistema operativo asigna una porcin de tiempo a lae$ecucin de cada thread. En este caso la e$ecucin de un
thread es interrumpida no slo si otro thread con m#s altaprioridad se vuelve -e$ecutable/* sino tambi"n cuando su
tiempo asignado de e$ecucin se acaba.
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
39/44
39
-hreads y la porta(ilidad de $a!a: de(ilidades
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
40/44
40
-hreads y la porta(ilidad de $a!a: de(ilidades
!i un sistema operativo no implementa time slicing* y si elthread no sale del estado -e$ecutable/* este continuar# su
e$ecucin hasta que muera. 6ientras tanto* ning3n otrothread podr# ser e$ecutado.
public class Habla extends Thread {
String mensaje;
public Habla(String msg){
mensaje = msg;
}
public void run() {
for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
41/44
41
-hreads y la porta(ilidad de $a!a: de(ilidades
)or lo tanto el siguiente programa e$ecutar#:
ambos threads contempor#neamente en un sistema con
time slicing. !lo el thread que imprime ola hasta terminar las ??
impresiones* y luego el thread que imprime ,hao* en un
sistema que no soporta time slicingpublic class Ejercicio {
public static void main(String arg[]) {
Habla h = new Habla( Hola ) ;
Habla c = new Habla( Chao );
h.start();c.start();
}
}
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
42/44
42
-hreads y la porta(ilidad de $a!a: de(ilidades
'o se debe asumir que la e$ecucin de una aplicacin se har#siempre en un sistema que soporta time slicing.
)or lo tanto* se debe incluir adecuadamente invocaciones alos m"todos yield* sleepy @ait* si los threads no se bloquean
en operaciones de I1O.
public class Habla extends Thread {
String mensaje;
public Habla(String msg){
mensaje = msg;
}
public void run() {
for (int i=1;i
-
8/10/2019 Clase 15 OOP Threads
43/44
43
-hreads y acceso a datos compartidos
Es com3n que dos o m#s threads tengan acceso a ob$etos encom3n
E$emplo:
!upongamos una aplicacin con dos threads que
actualian un ob$eto compartido* de la clase istorial:
public class Historial {
String[] mensajes = new String[1000];
int pos = 0;
public void agregar(String msg) {
mensaje[pos] = msg;
pos++;
}
}
Programacin orientada a Objeto - POO
-
8/10/2019 Clase 15 OOP Threads
44/44
44
-hreads y acceso a datos compartidos
public class Habla extends Thread {
String mensaje;
Historial historial;
public Habla(String msg, Historial h){
mensaje = msg;
historial = h;
}
public void run() {
for (int i=1;i