Title: Concurrencia
1Concurrencia
- En el mundo real pasan muchas cosas a la vez
- Con varias computadoras se pueden ejecutar
múltiples programas - Con una sola computadora se pueden simular la
ejecución paralela de varias actividades - múltiples hilos de ejecución comparten el uso de
un procesador
2Concurrencia
- Java soporta la ejecución paralela de varios
threads (hilos) - múltiples threads ejecutándose en una máquina
comparten recursos (memoria) - múltiples threads ejecutándose en varias máquinas
necesitan capacidades de comunicación
3Programación concurrente OO
- La concurrencia es natural en OO
- Ada y Simula 67 ya soportaban concurrencia
- Java es único entre los lenguajes de propósitos
generales que pone primitivas de concurrencia a
disposición del programador
4Aplicaciones concurrentes
- Descargas de grandes archivos de la WWW
- Recolección de basura de Java (garbage colector)
5Creacion de threads
- Crear un thread
- Configurarlo nombre, prioridad,etc.
- Ejecutarlo
- invocar el método start,
- éste invoca al método run
- cuando run devuelve el control el thread ha
terminado
6Creacion de threads
- Un thread se puede crear
- extendiendo una clase de Thread
- implementando la interface Runnable
7La clase Thread
- Un hilo de ejecución de Java (Java.lang)
- Métodos
- run() activa el thread
- start () activa run y vuelve al llamante
- join () espera por la terminación ( timeout
opcional) - interrupt () sale de un wait, sleep o join
- isInterrupted ()
- yield ()
- stop (), suspend (), resume ()
8La clase Thread
- Métodos estáticos
- sleep (milisegundos)
- currentThread ()
- Métodos de la clase Object que controlan la
suspensión del Thread actual - wait() (equivale a 0 milisegundos)
- wait (milisegundos)
- notify () notifyAll()
9Constructores de Thread
- public Thread ( String threadName)
- construye un thread cuyo nombre es threadName
- public Thread ()
- construye un thread cuyo nombre es Thread
concatenado con un dÃgito (Thread1, Thread2)
10Inicio de la ejecución de un hilo
- Se invoca al método start
- Este invoca a run y devuelve el control al
llamante - El invocador se ejecuta en paralelo con el thread
11Estados de hilos ciclo de vida
start
Completar E/S
Asignar procesador
Termina quantum
notify notifyAll
Solicitud E/S
wait
sleep
suspend
suspendido
stop completar
Resume
Expìra sleep
12Sincronización
- Solo un thread por vez puede acceder a un objeto
bloquea
Thread
Thread
13Métodos sincronizados
- Los métodos que tengan que acceder al mismo
objeto se deben sincronizar para lograr el
bloqueo. - La ejecución de dos métodos sincronizados es
mutuamente excluyente.
14Métodos sincronizados
- class Account
- private double balance
- public Account ( double inicial)
- balanceinicial
- public synchronized double getBalance
- return balance
- public synchronized void deposito (double amount)
balance amount
15Métodos sincronizados
Instancia (bloquean objetos)
Clase (bloquean clases)
16Métodos synchonized anulados
- Si una clase extendida anula un método
synchronized, el nuevo método puede o no ser
synchronized. - El método de la superclase continúa siendo
synchronized.
17Sentencias synchronized
- Permite ejecutar código sincronizado sin invocar
un método sincronizado
bloqueo
sentencia
18Sentencias synchronized
- Forma general
- synchronized (expresión)
- sentencia
-
- Cuando la sincronización se usa en muy pocos
lugares. Son más convenientes los métodos
sincronizados -
Objeto a bloquear
19Wait y notify
- Sirven para comunicar los threads entre sÃ
- synchronized void cuandoCondicion ( )
- while ( ! condicion )
- wait ( )
- .hacer lo que sea necesario cuando la condicion
sea cierta
20Wait y notify
- synchronized void cambiaCondicion ( )
- .cambiar algún valor usado en condición
- notify ( ) // notifyAll ( )
21Wait y notify
- Para que el contenido del objeto sea estable todo
debe ocurrir en método synchronized. - Cuando se suspende el thread libera en forma
atómica el bloqueo del objeto - La prueba de la condición debe estar siempre en
un bucle
22Wait
- public final void wait (long timeout) throws
InterruptedException - public final void wait (long timeout, int nanos)
throws InterruptedException - public final void wait () throws
InterruptedException
23Notify
- public final notify ( )
- public final notifyAll ( )
24Prioridades De Los threads
- Todo thread en Java tiene una prioridad en el
intervalo - Thread.MIN_PRIORITY (constante que vale 1)
- Thread.MAX_PRIORITY (constante que vale 10)
- Thread.NORM_PRIORITY (constante que vale 5)
25Manejo de la Concurrencia
- Ejecución de un hilo hasta que termine o se
bloquee (actividades de E/S) - Ejecución de un hilo por asignación de quantum
(cantidad de tiempo)
26Planificación de threads
- Mantener un hilo de máxima prioridad ejecutándose
en todo momento, de acuerdo a la forma en que
maneje la concurrencia. - La aparición de hilos de alta prioridad puede
posponer indefinidamente la ejecución de hilos de
prioridades ba.jas
27Planificación de threads
- La prioridad de un Thread se puede ajustar con el
método - setPriority ( int prioridad )
- 1lt prioridad lt 10
- La prioridad de un Thread se puede obtener con el
método - getPriority ( )
28Planificación de threads
- Un hilo puede llamar al método yield para dar
oportunidad a otros hilos de su misma prioridad a
ejecutarse, esto se usa siempre que el manejo de
la concurrencia no este basado en quantum. - public static void yield ( )
29Planificación de threads
- Un hilo se ejecuta hasta que ocurre alguna de las
situaciones siguientes - muere.
- se bloquea para entrada/salida.
- Invoca a sleep.
- invoca a yield.
- es desalojado por un hilo de mayor prioridad.
- hasta que expira su quantum.
30Planificación de threads
- Un hilo con prioridad más alta que el que se está
ejecutando, puede desalojar a éste si - si invoca a resume.
- si se acaba el perÃodo de sleep.
- si se completa la E/S por la cual se bloqueo.
- si se invoca notify o notifyAll para un hilo que
habÃa invocado wait.
31Sincronización de hilos
- Java usa monitores para la sincronización de
hilos. - Todo objeto con métodos synchronized es un
monitor. - El monitor sólo permite a un hilo por vez
ejecutar un método synchronized sobre el objeto.
32Sincronización de hilos
- Ejemplo productor / consumidor
- Dos hilos comparten una celda de memoria, uno
coloca datos en la celda y el otro consume esos
datos. - Sin sincronización es posible que el productor
coloque datos antes que el consumidor los
consuma, o que el consumidor duplique datos si
consume datos antes que el productor produzca un
nuevo dato.
33Sincronización de hilos
34Interface Runnable
- Otra forma de crear un thread es implementando la
interface runnable, que nos provee el metodo run,
para implementarlo en el thread.
35Interface Runnable
36Grupos de hilos
- Permite identificar varios hilos como
pertenecientes a grupo de hilos. - La clase ThreadGroup contiene los métodos
necesarios para crear y manipular grupos de
hilos. - El grupo tiene un nombre único.
- Los grupos se pueden tratar colectivamente.
37Grupos de hilos
- Tiene dos constructores
- public ThreadGroup (String cadenanombre)
- construye un ThreadGroup cuyo nombre es
cadenanombre - public ThreadGroup ( ThreadGroup padre, String
cadenanombre) - construye un ThreadGroup hijo de padre, llamado
cadenanombre
38Grupos de hilos
- La clase Thread tiene tres constructores que
permite crear un Thread y asociarlo a un grupo - public Thread (ThreadGrroup threadGroup, String
nombre) - public Thread (ThreadGrroup threadGroup, Runnable
objetoEjecutable) - public Thread (ThreadGrroup threadGroup, Runnable
objetoEjecutable, String cadena)
39Métodos de ThreadGroup
- public int activeCount() public int
activeGroupCount() - public final void checkAccess() public final
void destroy()
40Métodos de ThreadGroup
- public int enumerate(Thread list)
- public int enumerate(Thread list, boolean
recurse) - public int enumerate(ThreadGroup list)
- public int enumerate(ThreadGroup list, boolean
recurse)
41Métodos de ThreadGroup
- public final int getMaxPriority()
- public final String getName()
- public final ThreadGroup getParent()
- public final boolean isDaemon()
- public void list()
- public final boolean parentOf(ThreadGroup g)
42Métodos de ThreadGroup
- public final void resume()
- public final void setDaemon(boolean daemon)
- public final void setMaxPriority(int pri)
- public final void stop()
- public final void suspend()
- public String toString()
-
43Métodos de ThreadGroup
- public void uncaughtException(Thread t,
Throwable e)