Programacin Concurrente y Distribuida Prcticas Tema 1 Concurrencia
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 v Hilo: secuencia de ejecución dentro de un proceso v Todo programa Java tiene al menos un hilo: class principal { … public static void main (String args[]) {. . . } } v Dicho hilo principal puede crear nuevos hilos v Java soporta mecanismos de sincronización entre hilos 4
1. Hilos Tema 1: Concurrencia con Java v Formas de crear hilos en Java: Ø Por herencia Ø Por delegación Creación de hilos por herencia v Pasos a seguir: class mi. Hilo extends Thread { … public void run() { … } } … mi. Hilo hilo= new mi. Hilo(. . . ); hilo. set. Priority(…); hilo. set. Daemon(…); … hilo. start(); hilo. run(); … hilo. suspend(); … 5
Tema 1: Concurrencia con Java 1. Hilos Creación de hilos por herencia (cont. ) v Objetos de clase mi. Hilo son objetos Thread Ø Heredan la funcionalidad de Thread: pueden usar los métodos dicha clase para controlarse a sí mismos v 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 v Pasos a seguir: class mi. Hilo implements Runnable { … public void run() { … } } … mi. Hilo hilo= new mi. Hilo(. . . ); Thread t= new Thread(hilo); t. set. Priority(…); t. set. Daemon(…); … t. start(); … v Que clase sea de objetos activos no condiciona diseño v Inconveniente: Ø El hilo no puede controlarse a sí mismo 7
1. Hilos Tema 1: Concurrencia con Java v Solución: siguiente patrón de delegación class mi. Hilo implements Runnable { private Thread hilo; … public mi. Hilo(…) { 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 v Clase Thread: proporciona métodos de control v Algunos de los más importantes: Método Descripción void start() Inicia la ejecución de un hilo static Thread current. Thread() Proporciona referencia a hilo actual string get. Name() Devuelve nombre de un hilo void set. Name() Establece el nombre de un hilo static 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 10
Tema 1: Concurrencia con Java 2. Control de hilos Método Descripción void stop(); Aborta un hilo vid interrupt() Interrumpe un hilo boolean interrupted() Comprueba si hilo ha sido interrumpido, y limpia la bandera de interrumpido boolean is. Interrupted() Comprueba si hilo ha sido interrumpido void join() Hace esperar al hilo llamante hasta que termine el hilo sobre el que se llama. boolean is. Alive() 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 v Planificación basada en prioridades estáticas v Cada hilo tiene una prioridad entre Ø Thread. MIN_PRIORITY Ø Thread. MAX_PRIORITY Ø Por defecto: Thread. NORM_PRIORITY v No se garantiza que haya apropiación entre hilos de la misma prioridad Métodos relacionados con la planificación Descripción void set. Priority() Establece prioridad de un hilo int get. Priority() 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 v Objetos Java: similares a monitores (Hoare) monitor mimonitor { private: Datos y métodos locales, variables de condición public: void metodo 1 () { Métodos públicos } } void metodo 2 () { … } 15
Tema 1: Concurrencia con Java 4. Coordinación de hilos monitor mimonitor { private: condition C; public: void metodo 1 () { if (tengo_que_esperar()) wait(C); } void metodo 2 () { signal(C); } } 16
4. Coordinación de hilos Tema 1: Concurrencia con Java v Objetos java: modelo simplificado Ø Garantizan la exclusión mutua entre métodos synchronized Ø No hay variables de condición v wait(C) wait() Ø Método heredado de Object Ø Sólo en métodos declarados synchronized Ø Puede lanzar la excepción Interrupted. Exception v 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 v Problema: dificultad para implementar esperas guardadas 17
Tema 1: Concurrencia con Java 4. Coordinación de hilos class miclase { synchronized public void metodo 1(…) { … while(tengo_que_esperar()) wait(); …throws Interrupted. Exception … } synchronized public void metodo 2(…) try { { … wait(); cambiar_condicion(); } catch(Interrupted. Exception e) {}; notify. All(); … } } 18
4. Coordinación de hilos Tema 1: Concurrencia con Java v Inconvenientes de modelo Java Ø Notify. All(): 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 v Atributos volatile: pueden ser actualizados de manera concurrente Ø Buena práctica: atributos privados y modificados con exclusión mutua v 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); notify. All(); } synchronized public Object desapilar() { while(elementos. is. Empty ()) try{ wait() } catch (Interrupted. Exception e){e. print. Stack. Trace(); } Object resultado= elementos. element. At(elementos. size()-1); elementos. remove. Element. At(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 v Dos tipos de hilos en Java: Ø Hilos de usuario (por defecto) Ø Hilos demonio v La aplicación Java termina cuando terminan todos los hilos de usuario v Utilidad hilos demonio: actividades en segundo plano v El carácter de demonio de un hilo se le ha de asignar antes de iniciarlo (configuración) Métodos Descripción void set. Daemon (boolean d) Establece o elimina el carácter de demonio al hilo Boolean is. Daemon () Obtiene el carácter de demonio del hilo 22
23
- Slides: 23