Top Banner
Multitarea Multitarea Ing. Rolando Steep Quezada Martínez Ing. Rolando Steep Quezada Martínez [email protected] [email protected] Programación Avanzada en Java Programación Avanzada en Java
22
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Multitarea

MultitareaMultitarea

Ing. Rolando Steep Quezada MartínezIng. Rolando Steep Quezada Martínez

[email protected]@upnorte.edu.pe

Programación Avanzada en JavaProgramación Avanzada en Java

Page 2: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-22

Multitarea vs. MultiprocesoMultitarea vs. Multiproceso

• Multiproceso significa que el equipo hardware cuenta con mas de un procesador (CPU) y por tanto ejecuta varias tareas a la vez.

• Multitarea significa que varias tareas comparten el único procesador (CPU) dándonos la sensación de multiproceso.

• La multitarea se consigue mediante un planificador de tareas que va dando slots de CPU a cada tarea.

Page 3: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-44

Programación de Threads Programación de Threads (hilos o hebras)(hilos o hebras)

• La programación multithreading (multienhebrada o multi-hilo) permite la ocurrencia simultánea de varios flujos de control.

• Cada uno de ellos puede programarse independientemente y realizar un trabajo, distinto, idéntico o complementario, a otros flujos paralelos.

Page 4: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-55

Estados de un Thread (hilo)Estados de un Thread (hilo)

Page 5: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-77

La clase ThreadLa clase Thread

• La clase principal es java.lang.Thread.

• Nos ofrece el API genérico de los threads así como la implementación de su comportamiento.

• La lógica que va a ejecutar un thread se introduce en el método: public void run()

• Cuando termina la ejecución del método run() se termina el thread.

• La clase java.lang.Thread contiene un método run() vacío.

Page 6: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-88

La Interface RunnableLa Interface Runnable

• El interface Runnable solamente declara una función miembro denominada run, que han de definir las clases que implementen este interface.

• Como Java sólo soporta herencia simple y puede que el objeto que representa nuestra hebra sea mejor implementarlo como subclase de otra clase de nuestro sistema, Java nos permite crear una hebra a partir de cualquier objeto que implemente la interfaz Runnable.

Page 7: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-99

Crear un ThreadCrear un Thread

• Para crear un thread hay que instanciarlo llamando al constructor como con el resto de clases Java.

• Dependiendo de cómo hayamos implementado el thread se actuará de una forma u otra:

– Si hereda de la clase java.lang.Thread, simplemente se instancia nuestra clase.

– Si implementa el interfaz java.lang.Runnable, se instancia la clase java.lang.Thread pasándole como parámetro del un constructor una instancia de nuestra clase.

Page 8: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-1010

Iniciar un threadIniciar un thread

• Se usan dos técnicas para proveer el método runa un thread:

– Extender la clase Thread y sobre escribir el método run().

– Implementar la interface Runnable. En este caso, es un objeto Runnable el que provee el método run() del thread.

Page 9: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-1313

PrioridadesPrioridades

• Cuando existe un único procesador (CPU) no existe multiproceso real. Los distintos threads van compartiendo dicho procesador (CPU) siguiendo las políticas o algoritmos del Sistema Operativo.

• Pero esas políticas o algoritmos pueden tener en cuenta prioridades cuando realiza sus cálculos.

• La prioridad de un thread se establece mediante el método setPriority() pasándole un int entre:– Thread.MAX_PRIORITY– Thread.MIN_PRIORITY

Page 10: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-1515

Grupo de ThreadsGrupo de Threads

• Todo thread es miembro de un grupo de threads.

• La clase java.lang.ThreadGroup implementa los grupos de threads.

• El grupo de threads al que pertenece un thread se establece en su construcción. Luego es inmutable.

• Por defecto, un thread pertenece al grupo al que pertenece el thread desde donde se le creo.

• El grupo del thread principal se llama “main”.

Page 11: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-1616

Creación de GruposCreación de Grupos

• Para crear un thread en un grupo distinto al seleccionado por defecto, hay que añadir como parámetro del constructor la instancia del grupo:

ThreadGroup tg = new ThreadGroup(“Mis threads”);

Thread t = new Thread(tg);

• Para conocer el grupo al que pertenece un thread:

t.getThreadGroup();

Page 12: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-1717

Sincronización de ThreadsSincronización de Threads

• Hasta ahora vimos threads asincrónicos que no comparten datos ni necesitan coordinar sus actividades.

• Hay situaciones en las que los threads concurrentes comparten datos y en donde es necesario considerar el estado y coordinar las actividades de otros threads. Estos escenarios de programación se llaman productor/consumidor, y consisten en un productor que genera streams de datos que posteriormente serán consumidos por el consumidor.

• Los threads que comparten recursos comunes deben sincronizarse de alguna manera.

Page 13: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-1919

Bloqueo de ObjetosBloqueo de Objetos

• Una solución al problema de inconsistencia de datos consiste en que, para acceder a un recurso compartido, haya antes que “adquirirlo”.

• La hebra que adquiere el recurso bloquea el acceso a él.

• Las demás hebras, para acceder al recurso, intentarán adquirirlo y se quedarán bloqueadas hasta que lo “libere” la hebra que lo posee.

• De esta forma, el acceso al recurso compartido se realiza secuencialmente (por lo que deberemos tener cuidado para no eliminar completamente el paralelismo de nuestra aplicación.

Page 14: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-2121

Utilidades de Concurrencia en TigerUtilidades de Concurrencia en Tiger

• El paquete incorporado java.util.concurrent provee:

– Framework para la programación de tareas (hilos)– Soporte para invocables y soporte asíncrono– Sincronizadores– Colecciones concurrentes– Variables atómicas– Cerraduras– Engranaje de distribución de granularidad de nanosegundo

Page 15: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-2222

Framework para la programación de tareas Framework para la programación de tareas (hilos)(hilos)

• El framework Executor/ExecutorService/Executors soporta:– Invocación estandarizada.– Programación.– Ejecución.– Control de tareas asíncronas de acuerdo a políticas de

ejecución establecidas.• Executor es un interface.• ExecutorService es una extensión de Executor.• Executors es una fabrica para la creación de diversas

implementaciones de ExecutorService.

Page 16: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-2424

Soporte para invocables y soporte Soporte para invocables y soporte asíncronoasíncrono

• Una tarea invocable implementa la interface Callable, que define un el método call(), similar a run() de Runnable.

• La llamada del hilo somete al objeto Callable al Executor y luego sigue adelante.– Se llama a submit() y no a execute().– Retorna u objeto de tipo Future.

• La llamada del hilo entonces recupera el resultado usando el método get() del objeto de tipo Future.– Si el resultado está listo, es retornado,– Si el resultado no esta listo, la llamada será bloqueada

Page 17: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-2626

Sincronizadores (Semáforos)Sincronizadores (Semáforos)

• Típicamente se usan para restringir el acceso a recursos de número limitado

• El nuevo objeto Semaphore es creado con la misma cuenta que el número de recursos.

• Una tarea tata de tener acceso a un recurso invocando el método aquire().

• Retorna inmediatamente el recurso si la cuenta del semáforo es mayor a cero (>0).

• Bloquea la tarea si la cuenta es igual a cero (=0) antes que el método release() sea invocado por otra tarea.

• aquire() y release() son operaciones atómicas de tarea segura (thread safe).

Page 18: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-2727

Colecciones concurrentesColecciones concurrentes

• La interface BlockingQueue provee tareas seguras cuando múltiples tareas manipulan una colección.

• ArrayBlockingQueue es una implementación concreta simple.

• LinkedBlockingQueue, implementa la cola como una lista enlazada.

• PriorityBlockingQueue, permite establecer prioridades entre los objetos de la cola según un Comparator.

Page 19: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-2929

Variables atómicasVariables atómicas

• El paquete java.util.concurrent.atomic es añadido en Tiger• Es un pequeño paquete de utilidades para el soporte de tareas

seguras de libre cierre sobre variables simples.

Page 20: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-3030

CerradurasCerraduras

• La interface Lock– Operaciones de cierre (lock) más extensas que pueden ser

obtenidas usando métodos sincronizados y sentencias.– La apertura (unlock) no es automático, se debe usar try/fynally

para la apertura– El acceso no es bloqueado si se usa tryLock()

• La clase ReentrantReadWriteLock– Implementación concreta de Lock– La tareas pueden llamar a lock() múltiples veces y no bloquear.– Útil para código recursivo

Page 21: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-3131

ResumenResumen

• El método run() de un Thread o Runnable contiene el código que controla la ejecución del hilo.

• Un programa pone en marcha la ejecución de un hilo invocando el método start() del hilo que, a su vez, invoca al método run().

• El método isAlive() devuelve true si ya se invocó start() pero no se ha invocado stop().

• Cuando se invoca el método sleep() de un hilo en ejecución, ese hilo pasa al estado dormido. Un hilo dormido queda listo una vez transcurrido el tiempo de sueño especificado. Un hilo dormido no puede usar un procesador aunque haya uno disponible.

• Tiger simplifica la programación y mantenimiento de aplicaciones que soportan multitarea.

Page 22: Multitarea

Copyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada MartínezCopyright © 2007, Universidad Privada del Norte S.A.C. – Ing. Rolando Steep Quezada Martínez 14-14-3232

Práctica 14Práctica 14

– Implementar aplicaciones que soporten multitarea– Hacer uso de las utilidades de concurrencia de Tiger