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