Download Tema 1
Document related concepts
no text concepts found
Transcript
Programación Concurrente y Distribuida Prácticas Tema 1: Concurrencia con Java 1 Tema 1: Concurrencia con Java Índice: 1. Hilos 2. Control de hilos 3. Planificación 4. Coordinación de hilos 5. Hilos demonios 2 Tema 1: Concurrencia con Java Índice: 1. Hilos 2. Control de hilos 3. Planificación 4. Coordinación de hilos 5. Hilos demonios 3 Tema 1: Concurrencia con Java 1. Hilos Hilo: secuencia de ejecución dentro de un proceso Todo programa Java tiene al menos un hilo: class principal { … public static void main (String args[]) { . . . } } Dicho hilo principal puede crear nuevos hilos Java soporta mecanismos de sincronización entre hilos 4 1. Hilos Tema 1: Concurrencia con Java Formas de crear hilos en Java: Por herencia Por delegación Creación de hilos por herencia Pasos a seguir: class miHilo extends Thread { … public void run() { … } } … miHilo hilo= new miHilo(...); hilo.setPriority(…); hilo.setDaemon(…); … hilo.start(); hilo.run(); … hilo.suspend(); … 5 Tema 1: Concurrencia con Java 1. Hilos Creación de hilos por herencia (cont.) Objetos de clase miHilo son objetos Thread Heredan la funcionalidad de Thread: pueden usar los métodos dicha clase para controlarse a sí mismos Inconveniente: En Java: herencia simple… ¿Y si necesitamos heredar funcionalidad de otra clase? 6 Tema 1: Concurrencia con Java 1. Hilos Creación de hilos por delegación Pasos a seguir: class miHilo implements Runnable { … public void run() { … } } … miHilo hilo= new miHilo(...); Thread t= new Thread(hilo); t.setPriority(…); t.setDaemon(…); … t.start(); … Que clase sea de objetos activos no condiciona diseño Inconveniente: El hilo no puede controlarse a sí mismo 7 1. Hilos Tema 1: Concurrencia con Java Solución: siguiente patrón de delegación class miHilo implements Runnable { private Thread hilo; … public miHilo(…) { hilo= new Thread(this); … hilo.start(); } public void run() { hilo.suspend(); … } } 8 Tema 1: Concurrencia con Java Índice: 1. Hilos 2. Control de hilos 3. Planificación 4. Coordinación de hilos 5. Hilos demonios 9 Tema 1: Concurrencia con Java 2. Control de hilos Clase Thread: proporciona métodos de control Algunos de los más importantes: Método Descripción void start() Inicia la ejecución de un hilo static Thread currentThread() Proporciona referencia a hilo actual string getName() Devuelve nombre de un hilo void setName() Establece el nombre de un hilo void sleep (long milis[, int nanos]) Suspende hilo por un tiempo determinado void suspend(); Suspende hilo hasta que se reanude por resume() void resume(); Reanuda un hilo suspendido void stop(); Aborta un hilo 10 Tema 1: Concurrencia con Java 2. Control de hilos Método Descripción void interrupt() Interrumpe un hilo boolean interrupted() Comprueba si hilo ha sido interrumpido, y limpia la bandera de interrumpido boolean isInterrupted() Comprueba si hilo ha sido interrumpido void join() Hace esperar al hilo llamante hasta que termine el hilo sobre el que se llama. boolean isAlive() Comprueba si se ha llamado a start() pero aún no ha terminado el hilo. 11 Tema 1: Concurrencia con Java Índice: 1. Hilos 2. Control de hilos 3. Planificación 4. Coordinación de hilos 5. Hilos demonios 12 Tema 1: Concurrencia con Java 3. Planificación Planificación basada en prioridades estáticas Cada hilo tiene una prioridad entre Thread.MIN_PRIORITY Thread.MAX_PRIORITY Por defecto: Thread.NORM_PRIORITY No se garantiza que haya apropiación entre hilos de la misma prioridad Métodos relacionados con la planificación Descripción void setPriority() Establece prioridad de un hilo int getPriority() Obtiene la prioridad de un hilo void yield() Cede la CPU al planificador para dar la oportunidad de activarse a otros hilos 13 Tema 1: Concurrencia con Java Índice: 1. Hilos 2. Control de hilos 3. Planificación 4. Coordinación de hilos 5. Hilos demonios 14 4. Coordinación de hilos Tema 1: Concurrencia con Java Objetos Java: similares a monitores (Hoare) monitor mimonitor { private: Datos y métodos locales, variables de condición public: void metodo1 () { Métodos públicos } } void metodo2 () { … } 15 4. Coordinación de hilos Tema 1: Concurrencia con Java monitor mimonitor { private: condition C; public: void metodo1 () { if (tengo_que_esperar()) wait(C); } void metodo2 () { signal(C); } } 16 4. Coordinación de hilos Tema 1: Concurrencia con Java Objetos java: modelo simplificado Garantizan la exclusión mutua entre métodos synchronized No hay variables de condición wait(C) wait() Método heredado de Object Sólo en métodos declarados synchronized Puede lanzar la excepción InterruptedException signal(C) notify() Método heredado de Object Sólo en métodos declarados synchronized Reanuda cualquier hilo detenido en cualquier wait() del objeto Política de reanudación: preferencia al hilo reanudante Problema: dificultad para implementar esperas guardadas 17 Tema 1: Concurrencia con Java 4. Coordinación de hilos class miclase { synchronized public void metodo1(…) { … while(tengo_que_esperar()) wait(); …throws InterruptedException … } synchronized public void metodo2(…) try { { … wait(); cambiar_condicion(); } catch(InterruptedException e) {}; notifyAll(); … } } 18 4. Coordinación de hilos Tema 1: Concurrencia con Java Inconvenientes de modelo Java NotifyAll(): Ineficiente, para reanudar un hilo de entre N: • Reanudar N hilos • Efectuar N evaluaciones • Suspender N-1 hilos Notify(): soluciones complejas y difíciles de reusar y mantener synchronized debe ser explícito: dificulta la reutilización Atributos volatile: pueden ser actualizados de manera concurrente Buena práctica: atributos privados y modificados con exclusión mutua Sentencia synchronize (no recomendada): synchronize (expr) { … } … 19 Tema 1: Concurrencia con Java 4. Coordinación de hilos class pila { private Vector elementos= new Vector() synchronized public void apilar(Object elemento) { elementos.add(elemento); notifyAll(); } synchronized public Object desapilar() { while(elementos.isEmpty ()) try{ wait() } catch (InterruptedException e){e.printStackTrace();} Object resultado= elementos.elementAt(elementos.size()-1); elementos.removeElementAt(elementos.size()-1); return resultado; } } 20 Tema 1: Concurrencia con Java Índice: 1. Hilos 2. Control de hilos 3. Planificación 4. Coordinación de hilos 5. Hilos demonios 21 5. Hilos demonios Tema 1: Concurrencia con Java Dos tipos de hilos en Java: Hilos de usuario (por defecto) Hilos demonio La aplicación Java termina cuando terminan todos los hilos de usuario Utilidad hilos demonio: actividades en segundo plano El carácter de demonio de un hilo se le ha de asignar antes de iniciarlo (configuración) Métodos Descripción void setDaemon (boolean d) Establece o elimina el carácter de demonio al hilo Boolean isDaemon () Obtiene el carácter de demonio del hilo 22 23