Download - hilos - Java
ING. LUIGI ALAN CRUZ PONCE
ING. EN SISTEMAS COMPUTACIONALES
INSTITUTO TECNOLOGICO SUPERIOR
DE TAMAZUNCHALE
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
HilosNecesidad de dividir un programa en subtareas
que se ejecuten de manera independiente pero coordinada.
Un hilo es un flujo de control que se ejecuta dentro de un proceso, compartiendo cierta información del estado del proceso.
Un proceso = 1 o más hilos de ejecuciónCada hilo tiene la impresión de tener la CPU
para él, pero en realidad se reparte entre todos los hilos (monoprocesador).
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Concurrencia en JVM
Proporciona mecanismos de sincronización Creación/destrucción de hilos Exclusión mútua (sincronización) comunicación
java.lang.Thread
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Creación de Hilos
Thread unHilo = new Thread();public class OtroHilo extends Thread{...} Forma más fácil/rápida de crear un hilo
public class OtroHiloMas implements Runnable {...} Por si debe extender otra clase, sólo obliga a
implementar run()
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Creación de Hilospublic class SimpleThread extends Thread { private int countDown = 5; private static int threadCount = 0; private int threadNumber = ++threadCount; public SimpleThread() { System.out.println("Making " + threadNumber); } public void run() { while(true) { System.out.println("Thread " + threadNumber + "(" + countDown + ")"); if(--countDown == 0) return; } } public static void main(String[] args) { for(int i = 0; i < 5; i++) new SimpleThread().start(); System.out.println("All Threads Started"); } }
Extender la clase Thread
Sobrecargar métodoThread
Start(): construir obj., Config. Hilo y llamar a run()
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Clase ThreadMétodos de control:
Crear un thread (constructor Thread).
Iniciar la ejecución (start).
Detener la ejecución (suspend, interrupt, stop, sleep).
Reanudar la ejecución (resume).
Ceder el procesador (yield).
Esperar la terminación de otro thread (join).
Métodos de consulta y modificación de propiedades:
Nombre (getName / setName).
Prioridad (getPriority / setPriority): MIN_PRIORITY (1). NORM_PRIORITY (5), MAX_PRIORITY (10).
Grupo de hilos (getThreadGroup): Cada thread pertenece a un grupo.
Daemon (isDaemon / setDaemon): Indica si el thread es daemon o no.
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Clase ThreadPlanificación
Política de planificación: Por prioridad y con apropiación.
La prioridad es estática: El algoritmo de planificación no modifica la prioridad de los threads.
Se aplica round robin para 2 threads con igual prioridad.
Sincronización La sincronización entre threads se ofrece a través de
los métodos wait, notify y notifyAll, heredados de la clase java.lang.Object.
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Sincronización
Evitar condiciones de carreraBloquear el acceso a secciones críticasTodos los objetos tienen un bloqueo
asociado (monitor)Adquirir el bloqueo de un objeto impide que
cualquier otro hilo adquiera ese bloqueo hasta que sea liberado por el hilo que lo posee.
Métodos y sentencias synchronized
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Monitores Java
EsperaPropietarioEntrada(espera)
liberar
adquirir
liberary salir
acceso exclusivoentrar
hilo
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Métodos synchronized
Declarar métodos con sección crítica como synchronized: public synchronized sumar(int x){ saldo+=x; } public synchronized restar(int x){ saldo-=x; }
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Métodos synchronizedAl invocar a un método sincronizado sobre un
objeto1.se adquiere el bloqueo del objeto
2.se ejecuta el cuerpo del método
3.se libera el bloqueo (automáticamente)
Se impide que un hilo se bloquee por un bloqueo que ya posee (invocaciones recursivas):
la posesión de los bloqueos es por hilo, invocar un método sincronizado desde otro método también sincronizado no bloquea
el bloqueo se libera cuando se retorna del método sincronizado más externo
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Sentencias synchronized
Permiten adquirir el bloqueo de cualquier objeto, no sólo del objeto actual
Para ámbitos menores que un métodosynchronized (expresRefenciaAUnObjeto){ sentencias;}
Permite mantener el bloqueo únicamente el tiempo imprescindible.
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Sentencias synchronizedclass SumarYRestar{
Object bloqueoSaldo = new Object();
int saldo=0;
public sumar(){
int x = obtenerValor();
synchronized (bloqueoSaldo){
saldo += x;}
}
public restar(){....}
}
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Comunicación entre Hilossynchronized permite el bloqueo entre hilos,
pero también ha de haber comunicación entre ellos.
wait(): deja al hilo esperando por una condición, liberando el bloqueo sobre el objeto (op. atómica)
synchronized void siCondicion(){ while (!condicion) wait(); // hacer cuando se cumpla la condicion ...}
siempre en un bucle
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Comunicación entre Hilosnotify(), notifyAll(): indican a los hilos en
espera que la condición puede haberse cumplidosynchronized void cambiarCondicion(){ // se altera algún valor de la condición notifyAll(); // o notify();}
notifyAll() despierta a todos los hilos esperando, notify() selecciona sólo a uno para ser despertado
todos los hilos esperan por la misma condición sólo un hilo como mucho se puede beneficiar
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Planificación de Hilos
Cada hilo tiene una prioridad asociadaInicialmente recibe la prioridad del hilo que lo
crea Thread.MIN_PRIORITY, Thread.NORM_PRIORITY, Thread.MAX_PRIORITY
getPriority(), setPriority()
Replanificación voluntaria: Espera limitada
sleep(long milis) sleep(long milis, int nanos)
Cesión del turno yield()
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
FinalizaciónUna vez que se un hilo ha empezado a
ejecutarse, está vivo: isAlive() retorna true.
Un hilo continua hasta que termina: el método run() retorna normalmente el método run() finaliza bruscamente se invoca un destroy() sobre el hilo: para el hilo en seco
sin liberar los bloqueos.
Cancelación: Thread.interrup()isInterrupted()interrupt()
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Esperando a un hilo
Un hilo puede esperar a que otro finalicehiloAlQueEsperar.join()
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
volatileJava garantiza que la lectura o escritura de
cualquier variable (no long ni double) es atómica.El acceso atómico no garantiza que se lea el valor
escrito más recientemente.La sincronización no siempre es necesaria (un
escritor, muchos lectores)volatile indica al compilador que el valor del
campo podrá cambiar en cualquier momento, e impide las suposiciones del compilador sobre ese campo.
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Estados de un Hilo
runnable
new dead
bloqued
run()
yield()
sleep()
wait()notify()notifyAll()
returninterrupt()
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Estados de un HiloNew: objeto creado pero no ha sido iniciada su
ejecución.Runnable: se puede ejecutar cuando sea
planificado para utilizar la CPU. Puede o no estár ejecutándose, y no hay razón para que no se ejecute.
Dead: desaparición del hilo, normalmente como efecto de retornar del método run().
Blocked: el hilo podría ejecutarse pero existe algo que lo impide. El planificador no lo tendrá en cuenta hasta que vuelva al estado Runnable.