La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Programación Orientada a Objetos

Presentaciones similares


Presentación del tema: "Programación Orientada a Objetos"— Transcripción de la presentación:

1 Programación Orientada a Objetos
Fast Track to Java Unit 1: Overview and Positioning Programación Orientada a Objetos Anexo 4 Threads Universidad de Chile Departamento de Ciencias de la Computación Profesor: Juan Claudio Navarro

2 Temario Procesos y threads Creación de threads La clase Thread
La interfaz Runnable Ciclo de vida de un thread Sincronización Métodos wait() y notify() Locks explícitos

3 Threads Usando clases y objetos es posible dividir un programa en secciones independientes A menudo es necesario además dividir un programa en tareas separadas que se ejecutan independientemente; estas tareas son los threads

4 Procesos y Threads Procesos Threads
Un proceso es un programa ejecutándose Un proceso tiene: un espacio de memoria asignada uno o más threads Threads Un thread es una tarea corriendo en una "CPU virtual" Los threads de un proceso comparten un mismo espacio de memoria

5 Procesos y Threads

6 Unit 1: Overview and Positioning
Fast Track to Java Unit 1: Overview and Positioning ¿Por qué usar Threads? En ocasiones programas interactivos pueden lograr un mejor desempeño usando threads Para compartir el control al interior de un proceso Para hacer varias cosas "simultáneamente" Para que la interfaz de usuario pueda responder mientras se ejecuta otra tarea Para construir servidores que reciben conexiones simultáneas

7 Unit 1: Overview and Positioning
Fast Track to Java Unit 1: Overview and Positioning Ejemplos Un thread actualiza la pantalla mientras otro thread atiende el input del usuario Un servidor Web recibiendo múltiples conexiones simultáneamente Un programa simulador de carga que genera varios threads para estresar un servidor

8 Thread y Runnable Dos maneras de crear un thread:
Se crea una clase que extiende la clase Thread Se redefine (override) el método run() Se instancia la clase Se invoca el método start() sobre el objeto creado, para iniciar la ejecución del nuevo thread Se crea una clase que implementa la interfaz Runnable Se redefine (override) el método run() Se instancia un Thread entregando como parámetro una instancia Runnable Se invoca el método start() sobre el Thread creado, para iniciar la ejecución del nuevo thread

9 Un Ejemplo Sencillo public class MiThread extends Thread {
private int iteraciones = 5; private static int numeroThreads = 0; private int idThread = ++numeroThreads; public MiThread() { System.out.println("Creando " + idThread); } public void run() { for (; iteraciones > 0; iteraciones--) { System.out.println("Thread " + idThread + " (" + iteraciones + ")"); public static void main(String[] args) { for(int i = 0; i < 5; i++) new MiThread().start(); System.out.println("Todos los Threads iniciados");

10 Unit 1: Overview and Positioning
Fast Track to Java Unit 1: Overview and Positioning Manejo de Threads Para crear un thread: 1. Crear e instanciar un objeto thread 2. Configurar el thread (opcional) 3. Iniciar el thread (start) Ejemplo: public class Report extends Thread { public void run() { ... } class Cliente { void f() { new Report().start(); Al invocar a start() la JVM: crea un nuevo thread invoca el método run() del nuevo thread, dejando al thread activo El thread finaliza cuando el método run() retorna

11 Unit 1: Overview and Positioning
Fast Track to Java Unit 1: Overview and Positioning La Interfaz Runnable En lugar de extender la clase Thread, es posible implementar la interfaz Runnable, y luego instanciar directamente un Thread Ejemplo: public class Report implements Runnable { public void run() { ... } class Cliente { void f() { Report report = new Report(); new Thread().start(report);

12 Configuración de Threads
Fast Track to Java Unit 1: Overview and Positioning Configuración de Threads Prioridad (default: NORM_PRIORITY (5)) setPriority(int priority) El parámetro priority debe estar en el rango [Thread.MIN_PRIORITY (1), Thread.MAX_PRIORITY (10)] Nombre setName(String name) Demonio o usuario (default: usuario) setDaemon(boolean on) Los threads demonio son proveedores de servicios para los threads de usuario La Virtual Machine detiene la ejecución del programa cuando no quedan threads de usuario vivos Para establecer un thread como demonio se debe invocar setDaemon(true) antes de iniciar el thread

13 El Scheduler del JVM El Java Virtual Machine provee un scheduler que asigna tiempos de CPU a los diferentes threads del programa (priorizando a los threads de prioridades más altas) Cada JVM posee un thread activo (en ejecución), el que puede obtenerse invocando el método currentThread(): System.out.print(Thread.currentThread().getName()); Los demás threads pueden estar: listos para ejecutarse (runnable) bloqueados (blocked), por ejemplo esperando que se complete una operación de entrada / salida

14 Ciclo de Vida de un Thread
Un thread puede encontrarse en 4 estados: New: el thread ha sido creado pero aún no ha sido iniciado Runnable: el thread puede ser ejecutado por el scheduler Dead: la manera normal de morir de un thread es que su método run() finalice Blocked: el thread podría ejecutarse, pero algo lo impide; mientras se mantenga esta situación el scheduler no le entregará tiempo de CPU

15 Concurrencia J CAROLINA U
Supongamos que los métodos setName y getName manejan un arreglo de caracteres (no un String) Memoria J CAROLINA U Thread 1 Thread 2 Instrucción Instrucción setName(“JUAN”) getName() Instrucción Instrucción

16 Sincronización Para sincronizar la ejecución de diferentes threads sobre un mismo objeto se utiliza la palabra synchronized Los métodos y bloques synchronized se ejecutan secuencialmente sobre un objeto: mientras un método synchronized se ejecuta, no hay otros threads concurrentes ejecutando métodos o bloques synchronized sobre el mismo objeto public class MiClase { public synchronized void setName(String name) {...} public synchronized void getName() {...} public void f() { ... synchronized (this) {...} }

17 El Monitor de Object y Class
Java provee un “monitor” en la clase Object, utilizado para la sincronización de threads Cuando se invoca un método o un bloque synchronized sobre un objeto, su monitor es utilizado para bloquear el thread: Antes de ingresar al método o bloque sinchronized, el thread espera que el monitor del objeto esté disponible (quedando bloqueado si el monitor pertenece a otro thread) Una vez que el monitor se encuentra disponible, el thread ingresa al método o bloque synchronized, y pasa a ser el único dueño del monitor del objeto Al terminar el método o bloque synchronized, el thread pierde la propiedad del monitor Java provee un “monitor” en la clase Class, el cual es utilizado para sincronizar el acceso a métodos static de la clase

18 Coordinación de Threads
En ocasiones es necesario coordinar la ejecución de threads: llegado a un cierto punto de ejecución, un thread requiere que otro thread haya realizado una tarea particular para poder continuar Java provee los siguientes métodos en la clase Object void wait([long timeout [, int nanos]]) Hace que el thread actual espere que algún thread invoque a notify() o a notifyAll() sobre este objeto, o a que transcurra el tiempo indicado void notify() Despierta un thread que está esperando por este objeto void notifyAll() Despierta todos los threads que esperan por este objeto

19 Método wait() void wait([long timeout [, int nanos]])
Hace que el thread actual espere que algún thread invoque a notify() o a notifyAll() sobre este objeto, o a que transcurra el tiempo indicado El thread debe ser el dueño del monitor del objeto sobre el cual se invoca a wait() Al invocar a wait(), el thread pierde la propiedad del monitor del objeto Al ser despertado por otro thread que invoca a notify() sobre el objeto, este thread espera hasta poder retomar la propiedad del monitor del objeto, y en cuanto lo consigue, retoma su ejecución

20 Métodos notify() y notifyAll()
void notify() Despierta un thread que está esperando por este objeto Si varios threads están esperando por este objeto, se escoge arbitrariamente uno de ellos para despertarlo El thread despertado competirá de la manera usual con otros threads por la propiedad del monitor del objeto, antes de retomar su ejecución El thread debe ser el dueño del monitor del objeto sobre el cual se invoca a notify() void notifyAll() Despierta todos los threads que esperan por este objeto (aparte de esto, es idéntico a notify())

21 Bloqueando un Thread Un thread puede bloquearse por 5 motivos:
se ha invocado a sleep(milisegundos), el thread no se ejecutará por el tiempo indicado se ha invocado a wait(), el thread no se ejecutará hasta que se invoque a notify() o notifyAll() se ha invocado a suspend(), el thread no se ejecutará hasta que se invoque a resume() (*) el thread está esperando que se complete alguna entrada / salida el thread está intentando acceder a un método o una sección synchronized de un objeto cuyo monitor no se encuentra disponible (*) suspend() y resume() están “deprecated”

22 Locks Explícitos Java 5 incorporó manejo de locks explícitos en el paquete java.util.concurrent.locks La interfaz Lock permite manejar locks de una manera similar al uso de synchronized, pero con la flexibilidad de controlar el fin del lock La clase ReentrantLock es una implementación de Lock equivalente al uso de synchronized Lock l = new ReentrantLock(); l.lock(); try { // acceso a recursos protegidos por este lock } finally { l.unlock(); }

23 Locks Explícitos La interfaz ReadWriteLock (implementada por la clase ReentrantReadWriteLock) provee dos locks asociados, uno para operaciones de lectura (compartido), y otro para operaciones de escritura (exclusivo) // ejemplo, sin manejo de excepciones por simplicidad ReadWriteLock lock = new ReentrantReadWriteLock(); // acceso compartido lock.readLock().lock(); ... lock.readLock().unlock(); // acceso exclusivo lock.writeLock().lock(); lock.writeLock().unlock();

24 Otras Mejoras de Java 5 Java 5 introdujo diversas mejoras en el manejo de threads (java.util.concurrent): La clase ThreadPoolExecutor permite ejecutar tareas utilizando un pool de threads La clase BlockingQueue es una cola con operaciones que esperan si es necesario void put(E o) Agrega un elemento (si la cola está llena, espera que haya espacio disponible) E take() Retorna y elimina el primer elemento (si la cola está vacía, espera a que haya un elemento) La clase Semaphore maneja una cantidad de permisos, y provee métodos acquire() y release() para adquirirlos y liberarlos

25 Resumen Java permite utilizar threads para construir aplicaciones multitareas Para crear un thread, se puede extender la clase Thread, o implementar la interfaz Runnable La lógica a realizar por el thread se programa en el método run() Cada objeto posee un monitor, definido en la clase Object Al invocar un método o bloque synchronized sobre un objeto, el thread pasa a ser el único propietario del monitor del objeto (bloqueándose si éste no se encuentra disponible) Un método static synchronized utiliza el monitor del objeto de tipo Class correspondiente a la clase

26 Resumen Al invocar el método wait() sobre un objeto, el thread se bloquea a la espera de que otro thread invoque a notify() o notifyAll() sobre el mismo objeto Al invocar al método wait(), el thread libera el monitor del objeto, y lo recupera al ser notificado y proseguir su operación Java 5 incorporó locks explícitos, pools de locks, y otras funcionalidades adicionales


Descargar ppt "Programación Orientada a Objetos"

Presentaciones similares


Anuncios Google