clase 15 oop threads

Upload: alvaro-ignacio-rios-pena

Post on 02-Jun-2018

232 views

Category:

Documents


0 download

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