Sei sulla pagina 1di 44

Programacin Orientada a Objeto Programacin Orientada a Objeto

Octubre 2014
Programacin orientada a Objeto - POO
2
Temario
Programacin Multithread
Programacin orientada a Objeto - POO
3
Qu es un thread?
Hasta el momento hemos desarrollado programas secuenciales con
un nico thread: en cualquier instante durante la ejecucin de un
programa hay un nico punto de ejecucin.
Un thread
Un Programa
Programacin orientada a Objeto - POO
4
Qu es un thread?
Un thread es un flujo secuencial de control dentro de un programa
Un programa puede tener ms de un thread ejecutndose al mismo
tiempo.
Dos
thread
Un Programa
Programacin orientada a Objeto - POO
5
Qu es un thread?
os no!edoso en threads" es el uso de mltiples threads adentro de
un mismo programa" ejecutndose simultneamente y reali#ando
tareas diferentes.
a plataforma $%&% soporta programas multhreading a tra!'s del
lenguaje" de li(rer)as y del sistema de ejecucin.
Programacin orientada a Objeto - POO
6
Ejemplo
Una aplicacin que posee un thread que saluda y otro que
se despide:
Programacin orientada a Objeto - POO
7
Ejemplo
Output posibles:
Programacin orientada a Objeto - POO
8
Creacin de mltiples threads en Java
Los threads en Java se implementan por medio de la clase
java.lang.Thread.
Existen dos formas de crear threads en Java:
Extendiendo la clase java.lang.Thread
Implementando la interfa java.lang.Runnable
Programacin orientada a Objeto - POO
9
Creacin de threads extendiendo la clase
java.lang.Thread.
El thread debe ser una clase que extiende la clase Thread
!e debe sobreescribir el m"todo run() con el cdigo que
deber# ser e$ecutado por el thread.
El thread debe ser lanado invocando el m"todo
start()del ob$eto %heredado de la clase Thread&
Programacin orientada a Objeto - POO
10
Creacin de threads extendiendo la clase
java.lang.Thread Ejemplo 1.
public class Hola extends Thread {
public void run() {
for (int i=1;i<100;i++)
System.out.println( "Hola" + i );
}
}
public class Chao extends Thread {
public void run() {
for (int i=1;i<100;i++)
System.out.println( Chao" + i );
}
}
Programacin orientada a Objeto - POO
11
Creacin de threads extendiendo la clase
java.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"todo
start(). La simple invocacin del m"todo run()produce slo
su e$ecucin en el thread actual %como cualquier otro m"todo&.
Programacin orientada a Objeto - POO
12
Creacin de threads extendiendo la clase
java.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();
Programacin orientada a Objeto - POO
13
Creacin de threads extendiendo la clase
java.lang.Thread Ejemplo 2.
Programacin orientada a Objeto - POO
14
Creacin de threads extendiendo la clase
java.lang.Thread Ejemplo 2.
Programacin orientada a Objeto - POO
15
Creacin de threads extendiendo la clase
java.lang.Thread Ejemplo 2.
Programacin orientada a Objeto - POO
16
Creacin de threads extendiendo la clase
java.lang. Runnable.
La clase que contiene el proceso que ser# lanado dentro de
un nuevo thread debe implementar la interfa
java.lang.Runnable
)articularmente se debe implementar en la clase el m"todo
run()declarado en Runnable" con el cdigo que deber#
ser e$ecutado por el thread
)ara lanar el thread se debe crear una instancia de
java.lang.Thread* pasando al constructor de "ste una
referencia al ob$eto que implementa Runnable* y luego se
debe invocar el m"todo start()del ob$eto Thread
Programacin orientada a Objeto - POO
17
Creacin de threads extendiendo la clase
java.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:
Programacin orientada a Objeto - POO
18
Creacin de threads extendiendo la clase
java.lang. Runnable.
,jemplo de *lase que implementan Runnable :
public class Hola implements Runnable{
public void run() {
for (int i=1;i<100;i++)
System.out.println( "Hola" + i );
}
}
public class Chao implements Runnable {
public void run() {
for (int i=1;i<100;i++)
System.out.println( Chao" + i );
}
}
Programacin orientada a Objeto - POO
19
Creacin de threads extendiendo la clase
java.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
Thread pasando al constructor una referencia a un ob$eto Runnable* e
invocar el m"todo start()sobre +hread. La simple invocacin del m"todo
run()produce slo su e$ecucin en el thread actual %como cualquier otro
m"todo&.
Programacin orientada a Objeto - POO
20
Creacin de threads extendiendo la clase
java.lang.Runnable.
,jercicio
,rear un programa similar al e$emplo anterior que* en ve de usar clases
distintas 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 Thread y otra
implementando Runnable.
.aga la aplicacin que lance los threads.
Programacin orientada a Objeto - POO
21
Creacin de threads extendiendo la clase
java.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<100;i++)
System.out.println( mensaje + i );
}
}
public 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
22
Creacin de threads extendiendo la clase
java.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<100;i++)
System.out.println( mensaje + i );
}
}
public class Ejercicio {
public static void main(String arg[]) {
Thread h = new Thread( new Habla( Hola ) ) ;
Thread c = new Thread( new Habla( Chao ) );
h.start();
c.start();
}
}
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 se
hubiese implementado Runnable,
entonces aqu hubiese sido necesaria
la referencia a la clase Thread para
invocar el mtodo sleep().
Programacin orientada a Objeto - POO
24
Mtodos tiles para la clase Threads: sleep
public class Hola extends Thread {
public void run() {
for (int i=1;i<10;i++){
System.out.println( "Hola" + i );
try{
Thread.sleep( 1000 );
}catch(InterruptedException e){}
}
}
}
public class Chao extends Thread {
public void run() {
for (int i=1;i<10;i++){
System.out.println( "Chao" + i );
try{
sleep( (long) ( Math.random() * 1000) );
}catch (InterruptedException e){}
}
}
}
Detencin de 1222 ms
31 segundo4
-iempo de detencin al a#ar
Programacin orientada a Objeto - POO
25
Mtodos tiles para la clase Threads: yield
Detiene la ejecucin del thread actual y permite a otros thread
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 se
hubiese implementado Runnable,
entonces aqu hubiese sido necesaria
la referencia a la clase Thread para
invocar el mtodo yield().
Programacin orientada a Objeto - POO
26
public class Hola extends Thread {
public void run() {
for (int i=1;i<100;i++){
System.out.println( "Hola" + i );
Thread.yield();
}
}
}
public class Chao extends Thread {
public void run() {
for (int i=1;i<100;i++){
System.out.println( Chao" + i );
yield();
}
}
}
Mtodos tiles para la clase Threads: yield
,jemplo:
Programacin orientada a Objeto - POO
27
Ciclo de vida de un Threads
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
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 de
pausa ha transcurrido.
!i el thread hab2a invocado el m"todo wait de un ob$eto* otro thread lo
notifica de continuar por llamando al m"todo notify o al m"todo notifyAll del
mismo ob$eto %4&
si el thread estaba bloqueado en operacin de I1O* la operacin se ha
completado
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 true si el thread ha sido lanado %m"todo start invocado& y no
detenido
5etorna false si el thread est# en el estado -Nuevo thread/ %no ha sido
lanado& o est# -muerto/ %m"todo run terminado&
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 m3ltiples
threads
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
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 threads
simple denominado -fixed priority scheduling/
Este algoritmo secuencia la e$ecucin de threads en base a
la -prioridad relativa/ que les ha sido asignada
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 cualquier
momento por medio del m"todo setPriority. 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 int 6789)5IO5I+: ;<
public static final int 6I'9)5IO5I+: ;
public static final int 'O569)5IO5I+: =
Programacin orientada a Objeto - POO
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 uno
de ellos en modo round0robin
,uando el thread en e$ecucin pasa al estado -no
ejecutable/ o -muerto/ otro thread es seleccionado
para su e$ecucin.
La e$ecucin de un thread es interrumpida si otro thread con
m#s alta prioridad se vuelve -ejecutable/.
Programacin orientada a Objeto - POO
36
-hreads y la porta(ilidad de $a!a: de(ilidades
La responsabilidad de e$ecucin de los threads es pasada al
sistema operativo.
>istintos sistemas operativos mane$an los threads en distinta
forma: 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 una
porcin 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
37
-hreads y la porta(ilidad de $a!a: de(ilidades
La responsabilidad de e$ecucin de los threads es pasada al
sistema operativo.
>istintos sistemas operativos mane$an los threads en distinta
forma: 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
38
-hreads y la porta(ilidad de $a!a: de(ilidades
el sistema operativo asigna una porcin 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
39
-hreads y la porta(ilidad de $a!a: de(ilidades
Programacin orientada a Objeto - POO
40
-hreads y la porta(ilidad de $a!a: de(ilidades
!i un sistema operativo no implementa time slicing* y si el
thread no sale del estado -e$ecutable/* este continuar# su
e$ecucin hasta que muera. 6ientras tanto* ning3n otro
thread 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<100;i++)
System.out.println( mensaje + i );
}
}
,n un sistema sin time slicing" este se !uel!e un thread
ego)sta.
Programacin orientada a Objeto - POO
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 slicing
public 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
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 a
los 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<100;i++){
System.out.println( mensaje + i );
yield();
}
}
}
Programacin orientada a Objeto - POO
43
-hreads y acceso a datos compartidos
Es com3n que dos o m#s threads tengan acceso a ob$etos en
com3n
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
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<100;i++){
historial.agregar( mensaje );
yield();
}
}
public class Ejercicio {
public static void main(String arg[]) {
Historial historial = new Historial();
Habla h = new Habla( Hola, historial ) ;
Habla c = new Habla( Chao, historial );
h.start();
c.start();
}
}

Potrebbero piacerti anche