Download Presentación Powerpoint: Concurrencia con Java

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
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 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