Você está na página 1de 21

INSTITUTO TECNOLOGICO

SUPERIOR
DE TAMAZUNCHALE

ING. LUIGI ALAN CRUZ PONCE

ING. EN SISTEMAS COMPUTACIONALES


Hilos
 Necesidad 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ón
 Cada 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 Hilos public class SimpleThread extends 
Thread { 
  private int countDown = 5; 
  private static int threadCount = 0; 
  private int threadNumber = 
++threadCount;  Extender la
   clase
  public SimpleThread() { 
    System.out.println("Making " +  Thread
threadNumber); 
  } 
Sobrecargar   
método   public void run() { 
    while(true) { 
Thread       System.out.println("Thread " +  
        threadNumber + "(" + countDown 
+ ")"); 
      if(­­countDown == 0) return;  Start():
    }  construir
  } 
  
obj., Config.
  public static void main(String[]  Hilo y llamar
args) {  a run()
    for(int i = 0; i < 5; i++) 
      new SimpleThread().start(); 
    System.out.println("All Threads 
Started"); 
  } 
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
}
Clase Thread  Métodos de consulta y
 Métodos de control: modificación de
 Crear un thread propiedades:
(constructor Thread).  Nombre (getName /

 Iniciar la ejecución setName).


(start).  Prioridad (getPriority

 Detener la ejecución / setPriority):


MIN_PRIORITY (1). NORM_PRIORITY
(suspend, interrupt, (5), MAX_PRIORITY (10).
stop, sleep).  Grupo de hilos
 Reanudar la ejecución (getThreadGroup):
(resume). Cada thread pertenece a
 Ceder el procesador un grupo.
(yield).  Daemon (isDaemon /

 Esperar la terminación
ING. LUIGI ALAN CRUZ PONCE
setDaemon): Indica si el
TOPICOS SELECTOS DE PROGRAMACION

de otro thread (join). thread es daemon o no.


Clase Thread
 Planificació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
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
Sincronización
 Evitarcondiciones de carrera
 Bloquear el acceso a secciones críticas
 Todos 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

Entrada Propietario Espera


(espera)

acceso liberar
entrar exclusivo

adquirir
hilo

liberar
y salir

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION


Métodos synchronized

 Declararmé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 synchronized
 Alinvocar a un método sincronizado sobre
un objeto
1.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
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
sincronizado más externo
Sentencias synchronized
 Permiten adquirir el bloqueo de cualquier
objeto, no sólo del objeto actual
 Para ámbitos menores que un método
synchronized (expresRefenciaAUnObjeto){
   sentencias;
}
 Permite mantener el bloqueo únicamente el
tiempo imprescindible.

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION


Sentencias synchronized
class 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 Hilos
 synchronized 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 Hilos
 notify(), notifyAll(): indican a los
hilos en espera que la condición puede
haberse cumplido
synchronized 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
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

 sólo un hilo como mucho se puede beneficiar


Planificación de Hilos
 Cada hilo tiene una prioridad asociada
 Inicialmente 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


ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
 yield()
Finalización
 Una 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()
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION
 interrupt()
Esperando a un hilo
 Un hilo puede esperar a que otro finalice
 hiloAlQueEsperar.join()

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION


volatile
 Java 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
yield()

interrupt()
return
runnable
run()
new dead
sleep() notify()
wait() notifyAll()
bloqued

ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION


Estados de un Hilo
 New: 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
ING. LUIGI ALAN CRUZ PONCE TOPICOS SELECTOS DE PROGRAMACION

no lo tendrá en cuenta hasta que vuelva al

Você também pode gostar