laboratior de hilos
-
Upload
jordancest -
Category
Documents
-
view
222 -
download
0
Transcript of laboratior de hilos
-
8/18/2019 laboratior de hilos
1/12
1 1
SD Capítulo 1: Hilos en JavaLaboratorio 1
LABORATORIO 1: Hilos Threads
1 Ob!etivo:
Cono"er # utili$ar e%e"tiva&ente los "o&ponentes de hilos paraapli"a"iones en las 'ue se re'uiera # de &anera ade"uada
( )ro"edi&iento
• I&ple&entar* e!e"utar # probar el "+di,o de los ane-o 1 al.* de &anera ade"uada
• /valuar resultados obtenidos• /s"riba un reporte sobre las tareas reali$adas #
resultados•
/s"riba sus "on"lusiones
0 A,enda:
/!e"u"i+n de "+di,o: 2 &in)repara"ion reporte: 12 &in/ntre,a3 0 &in
4 en C Jesus 4artin Silva 5ernande$ 67SA85I)S8/)IS
-
8/18/2019 laboratior de hilos
2/12
(
SD Capítulo 1: Hilos en JavaLaboratorio 1
A7/9O 1
E je m plo 1: carrera de hilos
En el siguiente ejemplo, se muestra la ejecución de dos hilos con diferentes prioridades. Un hilose ejecuta a prioridad más baja que el otro. Los hilos incrementarán sus contadores hasta que el
hilo que tiene prioridad más alta alcance al contador que corresponde a la tarea con ejecuciónmás lenta.
import Java.awt.*;import Java.applet.Applet;
// En este applet se crean dos hilos que incrementan uncontador, se// proporcionan distintas prioridades a cada uno y se paracuando los// dos coinciden
public class SchThread etends Applet !"ontar alto,ba#o;
public void init$% !// "reamos un thread en &'', ya adelantadoba#o ( new "ontar$ &'' %;// El otro comien)a desde ceroalto ( new "ontar$ ' %;// Al que comien)a en &'' le asinamos prioridad m+nimaba#o.setriority$ Thread.-0121T3 %;// 3 al otro m4ima
alto.setriority$ Thread.-A50121T3 %;System.out.println$ 6rioridad alta es67alto.etriority$% %;
System.out.println$ 6rioridad ba#a es67ba#o.etriority$% %;
8
// Arrancamos los dos threads, y vamos repintando hasta que//el thread que tiene prioridad m4s alta alcan)a o supera al//que tiene prioridad m4s ba#a, pero empe)9 a contar m4s
//alto
public void start$% !ba#o.start$%;alto.start$%;while$ alto.et"ontar$% : ba#o.et"ontar$% %
repaint$%;repaint$%;ba#o.stop$%;alto.stop$%;8
// amos pintando los incrementos que reali)an ambos threads4 en C Jesus 4artin Silva 5ernande$ 67SA85I)S8/)IS
-
8/18/2019 laboratior de hilos
3/12
0 0
SD Capítulo 1: Hilos en JavaLaboratorio 1
public void paint$ ole cubbyhole;private int numero;
public roductor$"ubby>ole c, int numero% !cubbyhole ( c;this.numero ( numero;
8
public void run$% !?or $int i ( '; i : ='; i77% !cubbyhole.put$i%;
System.out.println$6roductor @67this.numero76 pone6 7i%;
try !sleep$$int%$-ath.random$% * =''%%;
8 catch $nterruptedEception e% !8
8
88
El consumidor, por su parte, está (hambriento), consume todos los enteros de "ubby>olee*actamente el mismo objeto en que el productor puso los enteros en primer lugar" tan prontocomo est+n disponibles.
class "onsumidor etends Thread !private "ubby>ole cubbyhole;private int numero;
public "onsumidor$"ubby>ole c, int numero% !
cubbyhole ( c;
this.numero ( numero;
4 en C Jesus 4artin Silva 5ernande$ 67SA85I)S8/)IS
-
8/18/2019 laboratior de hilos
4/12
.
SD Capítulo 1: Hilos en JavaLaboratorio 1
8public void run$% !int value ( ';?or $int i ( '; i : ='; i77% !value ( cubbyhole.et$%;System.out.println$6"onsumidor @67this.numero76 obtiene
67value%;88
8
En este ejemplo, el %roductor y el onsumidor comparten datos a tra!+s de un objeto
"ubby>ole com$n. -bser!ará que ninguno de los dos hace ning$n tipo de esfuer&o paraasegurarse de que el consumidor obtiene cada !alor producido una y sólo una !e&. Lasincroni&ación entre estos dos hilos realmente ocurre a un ni!el inferior, dentro de los m+todoset$% y put$% del objeto "ubby>ole. in embargo, asumamos por un momento que estosdos hilos no están sincroni&ados y !eamos los problemas potenciales que podr/a pro!ocar estasituación.
Un problema ser/a el que se dar/a cuando el roductor fuera más rápido que el"onsumidor y generara dos n$meros antes de que el "onsumidor tu!iera una
posibilidad de consumir el primer n$mero. s/ el "onsumidor se saltar/a un n$mero. %arte dela salida se podr/a parecer a esto.
"onsumidor @= obtiene Broductor @= pone Croductor @= pone D"onsumidor @= obtiene D
. . .
-tro problema podr/a aparecer si el consumidor fuera más rápido que el productor yconsumiera el mismo !alor dos o más !eces. En esta situación el "onsumidor imprimirá el
mismo !alor dos !eces y podr/a producir una salida como esta.
. . .
roductor @= pone C"onsumidor @= obtiene C"onsumidor @= obtiene Croductor @= pone D
. . .
1e cualquier forma, el resultado es erróneo. e quiere que el consumidor obtenga cadaentero producido por el productor y sólo una !e&. Los problemas como los descritosanteriormente, se llaman (condiciones de carrera). e alcan&an cuando !arios hilos ejecutadosas/ncronamente intentan acceder a un mismo objeto al mismo tiempo y obtienen resultadoserróneos.
%ara pre!enir estas condiciones en nuestro ejemplo %roductor2onsumidor, el
almacenamiento de un nue!o entero en "ubby>ole por el %roductor debe estar sincroni&ado
con la recuperación del entero por parte del onsumidor. El onsumidor debe consumir cada
entero e*actamente una !e&. El programa productor3consumidor utili&a dos mecanismos
diferentes para sincroni&ar los hilos roductor y "onsumidor4 los monitores, y los
m+todos noti?y$% y wait.
Ejemplo 3: problema del productor-consumidor modificado
4 en C Jesus 4artin Silva 5ernande$ 67SA85I)S8/)IS
-
8/18/2019 laboratior de hilos
5/12
SD Capítulo 1: Hilos en JavaLaboratorio 1
En el ejemplo anterior del productor3 consumidor tiene dos m+todos de
sincroni&ación5 put$%, que cambia el !alor de CubbyHole, y et$%, para recuperar
el !alor actual. Este ser/a el código fuente del objeto CubbyHole utili&ando las t+cnicas de
sincroni&ación nue!as 5
class "ubby>ole !private int contents;private boolean available ( ?alse;
public synchroni)ed int et$%! while $available (( ?alse%!
try! wait$%;
8 catch $nterruptedEception e% !8
8available ( ?alse;noti?y$%;return contents;
8
public synchroni)ed void put$int value% !while $available (( true% !
try !wait$%;
8 catch $nterruptedEception e% !8
8contents ( value;available ( true;noti?y$%;
88
La !ariable contents tiene el !alor actual de "ubby>ole y available indica sise puede recuperar o no el !alor. uando available es !erdadero, el productor a$n noha acabado de producir.
"ubby>ole tiene dos m+todos de sincroni&ación, y 6a!a proporciona un solo monitor para cada ejemplar de "ubby>ole incluyendo el compartido por el roductor y el
"onsumidor". iempre que el control entra en un m+todo sincroni&ado, el hilo que ha llamadoal m+todo adquiere el monitor del objeto al cual pertenece el m+todo. -tros hilos no puedenllamar a un m+todo sincroni&ado del mismo objeto mientras el monitor no sea liberado.
Nota: 6a!a permite re3adquirir un monitor. En este caso se trata de los llamados monitores
re-entrantes.
uando el roductor in!oca el m+todo put$% de "ubby>ole, adquiere el monitor
del objeto CubbyHole y por lo tanto el "onsumidor no podrá llamar a et$% de
CubbyHole y se quedará bloquedo e*iste un m+todo, wait$%, que libera temporalmente el
monitor". 1e igual forma sucede cuando el "onsumidor in!oca et$%.
public synchroni)ed void put$int value% !4 en C Jesus 4artin Silva 5ernande$ 67SA85I)S8/)IS
-
8/18/2019 laboratior de hilos
6/12
SD Capítulo 1: Hilos en JavaLaboratorio 1
// El productor adquiere el monitorwhile $available (( true% !
try! wait$%;
8 catch $nterruptedEception e% !
88contents ( value;available ( true;noti?y$%;// lo noti?ica al roductor
// El productor libera el monitor8public synchroni)ed int et$% !
// El consumidor adquier el monitorwhile $available (( ?alse% !
try !wait$%; // espera que el roductor invoque a
noti?y $%8 catch $nterruptedEception e% !8
8available ( ?alse;noti?y$%; return contents;
// el "onsumidor libera el monitor8
Ejemplo 4: Hilos en applets.
7ecordar que un applet se define como un programa 6a!a que podemos incluir en una página
8:L como si de una imagen se tratara. Un na!egador que soporta la tecnolog/a 6a!a presentará una página que contiene un applet , transfiriendo pre!iamente el código del applet alsistema local y ejecutándolo con su :áquina ;irtual 6a!a 6;:" la del na!egador".
Este apartado aborda tres ejemplos de uso de los hilos en applet s. 1ado que no se hace
ning$n inciso en el código básico de los hilos, se recomienda consultar los apartados anteriores
para entender el uso de los mismos.
El primer applet , nimatorpplet, muestra cómo usar un hilo para desarrollar una tarearepetiti!a. El segundo ejemplo ra&ona el uso de hilos para lle!ar a cabo iniciali&aciones derelati!o coste. %or $ltimo, se presenta un ejemplo un poco más e*tenso de uso de hilos conconcurrencia.
Este es un ejemplo de un applet que crea un hilo de animación que nos presenta el globo
terráqueo en rotación. qu/ podemos !er que estamos creando un hilo de s/ mismo, lo que se
conoce como concurrencia. demás, animaci9n.start$% llama al m+todo start$%
del hilo, no del applet , el cual, automáticamente, llamará a la función miembro run$% del hilo.
continuación, el código fuente5
mport #ava.awt.*;mport #ava.applet.Applet;
ublic class Animacion etends Applet implments 1unnable !mae imaenes F;
4 en C Jesus 4artin Silva 5ernande$ 67SA85I)S8/)IS
-
8/18/2019 laboratior de hilos
7/12
; ;
SD Capítulo 1: Hilos en JavaLaboratorio 1
-ediaTracGer tracGer;int indice ( ';Thread animacion;
nt maAncho, maAlto;mae o??Scrmae; //"omponente o??Hscreen para bu??erin
doble
-
8/18/2019 laboratior de hilos
8/12
?ichero %;//1eistramos las im4enes con el tracGertracGer.addmae$ imaens i F, i%;
8try ! //Ptili)amos el tracGer para//comprobar que todas las im4enes
//est4n caradastraGcer.waitorAll$%;
8 catch$ nterruptedEception e %!;8
carado ( true;8
//intamos el ?otorama que corresponda
public void paint$
-
8/18/2019 laboratior de hilos
9/12
8
//1alenti)amos la animaci9n para que pare)ca normaltry !
animacion.sep$ &'' %;8 catch$ nterruptedEception e % !
;8
//intamos el siuiente ?otoramarepaint$%;
88
8
En el ejemplo podemos obser!ar más cosas. La !ariable thActual es propia de cada hiloque se lance, y la !ariable animaci9n la estarán !iendo todos los hilos.
-
8/18/2019 laboratior de hilos
10/12
public abstract void destroy $%
El m+todo destroy se in!oca para liberar todos los recursos solicitados. ambi+n se
encarga de la sincroni&ación de cualquier hilo pendiente. Este m+todo se llama una sola !e&,
automáticamente, como el m+todo init.
-
8/18/2019 laboratior de hilos
11/12
ANEXO 2
Funciones iem!ro de la "lase Thread
Sumario de constructores
Thread$%
7eali&a la reser!a de memoria necesaria para la creación de un nue!o objeto Thread.
Thread$1unnable target%7eali&a la reser!a de memoria necesaria para la creación de un nue!o objeto Thread.
Thread$1unnable taret, Strin name%7eali&a la reser!a de memoria necesaria para la creación de un nue!o objeto Thread.
Thread$Strin name%7eali&a la reser!a de memoria necesaria para la creación de un nue!o objeto Thread.
Thread$Thread
-
8/18/2019 laboratior de hilos
12/12
?nterrumpe la ejecución del hilostatic boolean interrupted$%
omprueba si el hilo actual ha sido interrumpido
boolean isAlive$%omprueba si el hilo está !i!oboolean isNaemon$%
omprueba si el hilo es un hilo daemonvoid setNaemon$boolean on%
Establece este hilo como hilo daemon, o como hilo de usuariovoid #oin$%
Espera a que este hilo mueravoid #oin$lon millis%
Espera, como mucha millis milisegundos a que este hilo muera
void run$%i este hilo se construyó utili&ando un objeto 1unnable de ejecución independiente,
entonces el m+todo run de ese objeto es in!ocado4 en otro caso, este m+todo no hace nada y!uel!e.static void sleep$lon millis%
8ace que el hilo actualmente en ejecución pase a dormir temporalmente durante el n$mero
de milisegundos especificado.void start$%
8ace que este hilo comience la ejecución4 la :áquina ;irtual de 6a!a llama al m+todo runde este hilo.
Strin toStrin$%1e!uel!e una representación en formato cadena de este hilo, incluyendo el nombre del hilo,
la prioridad, y el grupo de hilos.
static void yield$%8ace que el hilo actual de ejecución, pare temporalmente y permita que otros hilos se
ejecuten $til en sistemas con planificación de hilos no pre!enti!a".
e aconseja consultar las referencia citada anteriormente para consultar la descripción de
m+todos cuyo uso directo es inherentemente inseguro, como son stop, suspend y resume.
Métodos heredados de la clase java.lang.bject
clone, equals, ?inali)e, et"lass, hash"ode, noti?y, noti?yAll, wait