laboratior de hilos

Upload: jordancest

Post on 07-Jul-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

  • 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