SlideShare a Scribd company logo
1 of 18
1
10. Hilos
– Definición y ejecución
• Thread y Runnable
– Ciclo de vida de un hilo
• Interrupción
• Bloqueo:
– sleep
– Sincronización
2
Hilos
• Trasladan el concepto de multitarea a la ejecución de un
programa.
• Resuelven problemas de difícil solución sin ellos:
– ¿Cómo conseguimos atender la pulsación de teclas del usuario y conceder
el turno a las entidades del juego para que se muevan
independientemente?
• Hilo = flujo de ejecución
• El uso de hilos conlleva muchos RIESGOS:
– Distintos flujos de ejecución accediendo a los mismos objetos
del programa (!!!)
– Surgen todos los problemas de la programación
concurrente
El lenguaje de programación Java 3
Definición y Ejecución de un hilo
• Un hilo es un objeto cuya clase hereda de Thread
• Define su flujo de ejecución en un método run()
• Ejemplo:
public class Temporizador extends Thread {
public void run() {
...
}
}
• Comienzan su ejecución con una llamada a start()
Temporizador temp = new Temporizador();
temp.start();
El lenguaje de programación Java 4
Problema con la herencia
• Heredar de Thread puede resultar inconveniente: herencia simple.
• Solución: uso de interfaces
interface Runnable {
void run ();
}
• El hilo tiene la opción de implementar la interfaz:
public class Temporizador extends Notificador
implements Runnable{
public void run() { ...}
• Pero la clase no es un hilo, hace falta convertirla:
Temporizador temp = new Temporizador();
Thread hilo = new Thread(temp);
hilo.start();
• Todas las operaciones sobre el hilo hay que hacerlas con la variable
Thread.
El lenguaje de programación Java 5
Finalización de un Hilo
• El flujo principal de un programa acaba cuando termina el método main.
• Un hilo acaba cuando finaliza el método run() normal o por una
excepción no capturada.
• A veces es necesario detener un hilo, pero debido a cuestiones de
concurrencia la detención debe ser ordenada: Interrupción
hilo.interrupt();
• El hilo debe controlar cuando se solicita su interrupción:
if (Thread.interrupted()) ...
• Consideraciones método interrupted():
– El método interrupted es de clase para poder llamarlo desde una clase que no
herede de Thread
– La llamada al método resetea un flag de interrupción. Alternativa:
Thread.currentThread().isInterrupted();
El lenguaje de programación Java 6
Ciclo de vida
• Un hilo puede estar en cuatro estados:
– Inicial: antes de ejecutar start(). En realidad aún no es un hilo.
– En ejecución: tras ejecutar start() y durante el método run().
– Bloqueado:
• En un candado (sincronización ...)
• Durmiendo: Thread.sleep(milisegundos);
– Finalizado.
• Podemos averiguar si el hilo está en ejecución o
bloqueado:
hilo.isAlive();
El lenguaje de programación Java 7
Método sleep
• Un hilo puede ser interrumpido durante el sueño con una
llamada interrupt().
• El método sleep lanza la excepción InterruptedException
while (true) {
try {
Thread.sleep(1000);
System.out.println(“hola”);
} catch (InterruptedException e) { ...}
}
• Cuando un hilo es interrumpido durante el sueño no queda
activado el flag de interrupción (!!)
El lenguaje de programación Java 8
Sincronización
• Varios hilos accediendo a los mismos datos pueden dar lugar a
inconsistencias.
• Ejemplo: clase Punto método incX()
– x = x + 1;
• Hay que contemplar la posibilidad de que un método sea ejecutado
concurrentemente y protegerlo: (esquema a priori)
– public synchronized void incX() { ... }
– La llamada al método bloquea al hilo si hay otro ejecutando esa operación sobre el
mismo objeto.
• Si la clase no está protegida, los hilos deben evitar los problemas de
concurrencia poniendo un candado sobre el objeto: (esquema a
posteriori)
synchronized(pto) {
pto.incX();
...
}
El lenguaje de programación Java 9
Cuestiones avanzadas y Conclusiones
• Grupos de hilos.
• Prioridades.
• Estrategias de sincronización
• ...
• Consejos:
– Programar hilos puede ser un perjuicio más que un beneficio.
– Hay que utilizar los hilos con sensatez
El lenguaje de programación Java 10
Ejemplo - Temporizador
import java.util.*;
public class Temporizador extends Thread {
private int espera;
private List despertables = new ArrayList();
public Temporizador (int espera) {
this.espera = espera;
}
public void addDespertable (Despertable d) {
despertables.add(d);
}
public void removeDespertable (Despertable d) {
despertables.remove(d);
}
El lenguaje de programación Java 11
Ejemplo - Temporizador
public void run () {
while (!interrupted()) {
try {
Thread.sleep(espera);
} catch (InterruptedException e) {
break;
}
Iterator it = despertables.iterator();
while (it.hasNext()) {
Despertable d = (Despertable)it.next();
d.despierta();
}
}
}
}
El lenguaje de programación Java 12
Ejemplo - Temporizador
public interface Despertable {
void despierta();
}
public class Perezoso implements Despertable {
private String nombre;
public Perezoso (String nombre) {
this.nombre = nombre;
}
public void despierta () {
System.out.println(nombre + ": he sido despertado");
}
}
El lenguaje de programación Java 13
Ejemplo - Programa
public class Programa {
public static void main (String[] args) {
Temporizador temp = new Temporizador (1000);
temp.addDespertable(new Perezoso("1"));
temp.addDespertable(new Perezoso("2"));
temp.start();
//Esperamos 5 sg para interrumpir la alarma
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
temp.interrupt();
// Espero a que termine
while (temp.isAlive());
}
}
El lenguaje de programación Java 14
Ejemplo- salida del programa
perezoso.despierta
perezoso.despierta
perezoso.despierta
perezoso.despierta
temp.interrupt
El lenguaje de programación Java 15
Reflexión en Java
• Paquete java.lang.reflect
• Incluye las clases:
– Field
– Method
– Constructor
• Permite:
– Examinar las propiedades de una clase en tiempo de ejecución.
– Inspeccionar los objetos en tiempo de ejecución
– Utilizar los objetos Method como si fueran punteros a función
El lenguaje de programación Java 16
clase Class
• public static Class forName(String className)
• Field [] getFields()
• Field [] getDeclaredFields()
• Field getField(String name)
• Method [] getMethods
• Method [] getDeclaredMethods()
• Method getMethod(String name,
Class[] parameterTypes)
• Constructor [] getConstructors
• Constructor [] getDeclaredConstructors()
• String getName()
• boolean isInstance(Object obj) //equivale instanceof
El lenguaje de programación Java 17
clases Field y Method
• Clase Field:
– public Object get(Object obj)
– public Class getType()
– public String getName()
• Clase Method:
– public Class[] getExceptionTypes()
– public Class[] getParameterTypes()
– public Class getReturnType()
– public String getName()
– public Object invoke(Object obj, Object[] args)
• si obj = null invocamos un método de clase
El lenguaje de programación Java 18
Ejemplo: invocar método de clase
class Cuenta{
public static Cuenta abrir(Persona titular){
…
}
}
• Invocar al método de clase mediante reflexión:
Persona titu = bd.getCliente(“pepito”);
Class claseCta = Class.forName(“banco.Cuenta”);
Method metodoAbrir = claseCta.getMethod(“abrir",
new Class[]{Persona.class});
Cuenta cta = (Cuenta)metodoAbrir.invoke(null,
new Object[] {titu});

More Related Content

Similar to hilosJava.pptx

Similar to hilosJava.pptx (20)

Threads.pdf
Threads.pdfThreads.pdf
Threads.pdf
 
programacion concurrente java.pptx
programacion concurrente java.pptxprogramacion concurrente java.pptx
programacion concurrente java.pptx
 
DefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJavaDefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJava
 
2o departamental Programacion 3
2o departamental Programacion 32o departamental Programacion 3
2o departamental Programacion 3
 
Chap 15fpin
Chap 15fpinChap 15fpin
Chap 15fpin
 
Programación multitarea
Programación multitareaProgramación multitarea
Programación multitarea
 
Chap 15apin
Chap 15apinChap 15apin
Chap 15apin
 
Uso de threads en C#
Uso de threads en C#Uso de threads en C#
Uso de threads en C#
 
Threads en java
Threads en javaThreads en java
Threads en java
 
Hilos
HilosHilos
Hilos
 
Threads en Java
Threads en JavaThreads en Java
Threads en Java
 
Información básica Java
Información básica JavaInformación básica Java
Información básica Java
 
Hilos
HilosHilos
Hilos
 
De Threads a CompletableFutures
De Threads a CompletableFuturesDe Threads a CompletableFutures
De Threads a CompletableFutures
 
Thread 01
Thread 01Thread 01
Thread 01
 
Multitarea
MultitareaMultitarea
Multitarea
 
Thread
ThreadThread
Thread
 
Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gio
 
Programacion concurrente
Programacion concurrenteProgramacion concurrente
Programacion concurrente
 
Unidad 7 conceptos Avanzados en la Programacion orientado a objetos
Unidad 7 conceptos Avanzados en la Programacion orientado a objetosUnidad 7 conceptos Avanzados en la Programacion orientado a objetos
Unidad 7 conceptos Avanzados en la Programacion orientado a objetos
 

hilosJava.pptx

  • 1. 1 10. Hilos – Definición y ejecución • Thread y Runnable – Ciclo de vida de un hilo • Interrupción • Bloqueo: – sleep – Sincronización
  • 2. 2 Hilos • Trasladan el concepto de multitarea a la ejecución de un programa. • Resuelven problemas de difícil solución sin ellos: – ¿Cómo conseguimos atender la pulsación de teclas del usuario y conceder el turno a las entidades del juego para que se muevan independientemente? • Hilo = flujo de ejecución • El uso de hilos conlleva muchos RIESGOS: – Distintos flujos de ejecución accediendo a los mismos objetos del programa (!!!) – Surgen todos los problemas de la programación concurrente
  • 3. El lenguaje de programación Java 3 Definición y Ejecución de un hilo • Un hilo es un objeto cuya clase hereda de Thread • Define su flujo de ejecución en un método run() • Ejemplo: public class Temporizador extends Thread { public void run() { ... } } • Comienzan su ejecución con una llamada a start() Temporizador temp = new Temporizador(); temp.start();
  • 4. El lenguaje de programación Java 4 Problema con la herencia • Heredar de Thread puede resultar inconveniente: herencia simple. • Solución: uso de interfaces interface Runnable { void run (); } • El hilo tiene la opción de implementar la interfaz: public class Temporizador extends Notificador implements Runnable{ public void run() { ...} • Pero la clase no es un hilo, hace falta convertirla: Temporizador temp = new Temporizador(); Thread hilo = new Thread(temp); hilo.start(); • Todas las operaciones sobre el hilo hay que hacerlas con la variable Thread.
  • 5. El lenguaje de programación Java 5 Finalización de un Hilo • El flujo principal de un programa acaba cuando termina el método main. • Un hilo acaba cuando finaliza el método run() normal o por una excepción no capturada. • A veces es necesario detener un hilo, pero debido a cuestiones de concurrencia la detención debe ser ordenada: Interrupción hilo.interrupt(); • El hilo debe controlar cuando se solicita su interrupción: if (Thread.interrupted()) ... • Consideraciones método interrupted(): – El método interrupted es de clase para poder llamarlo desde una clase que no herede de Thread – La llamada al método resetea un flag de interrupción. Alternativa: Thread.currentThread().isInterrupted();
  • 6. El lenguaje de programación Java 6 Ciclo de vida • Un hilo puede estar en cuatro estados: – Inicial: antes de ejecutar start(). En realidad aún no es un hilo. – En ejecución: tras ejecutar start() y durante el método run(). – Bloqueado: • En un candado (sincronización ...) • Durmiendo: Thread.sleep(milisegundos); – Finalizado. • Podemos averiguar si el hilo está en ejecución o bloqueado: hilo.isAlive();
  • 7. El lenguaje de programación Java 7 Método sleep • Un hilo puede ser interrumpido durante el sueño con una llamada interrupt(). • El método sleep lanza la excepción InterruptedException while (true) { try { Thread.sleep(1000); System.out.println(“hola”); } catch (InterruptedException e) { ...} } • Cuando un hilo es interrumpido durante el sueño no queda activado el flag de interrupción (!!)
  • 8. El lenguaje de programación Java 8 Sincronización • Varios hilos accediendo a los mismos datos pueden dar lugar a inconsistencias. • Ejemplo: clase Punto método incX() – x = x + 1; • Hay que contemplar la posibilidad de que un método sea ejecutado concurrentemente y protegerlo: (esquema a priori) – public synchronized void incX() { ... } – La llamada al método bloquea al hilo si hay otro ejecutando esa operación sobre el mismo objeto. • Si la clase no está protegida, los hilos deben evitar los problemas de concurrencia poniendo un candado sobre el objeto: (esquema a posteriori) synchronized(pto) { pto.incX(); ... }
  • 9. El lenguaje de programación Java 9 Cuestiones avanzadas y Conclusiones • Grupos de hilos. • Prioridades. • Estrategias de sincronización • ... • Consejos: – Programar hilos puede ser un perjuicio más que un beneficio. – Hay que utilizar los hilos con sensatez
  • 10. El lenguaje de programación Java 10 Ejemplo - Temporizador import java.util.*; public class Temporizador extends Thread { private int espera; private List despertables = new ArrayList(); public Temporizador (int espera) { this.espera = espera; } public void addDespertable (Despertable d) { despertables.add(d); } public void removeDespertable (Despertable d) { despertables.remove(d); }
  • 11. El lenguaje de programación Java 11 Ejemplo - Temporizador public void run () { while (!interrupted()) { try { Thread.sleep(espera); } catch (InterruptedException e) { break; } Iterator it = despertables.iterator(); while (it.hasNext()) { Despertable d = (Despertable)it.next(); d.despierta(); } } } }
  • 12. El lenguaje de programación Java 12 Ejemplo - Temporizador public interface Despertable { void despierta(); } public class Perezoso implements Despertable { private String nombre; public Perezoso (String nombre) { this.nombre = nombre; } public void despierta () { System.out.println(nombre + ": he sido despertado"); } }
  • 13. El lenguaje de programación Java 13 Ejemplo - Programa public class Programa { public static void main (String[] args) { Temporizador temp = new Temporizador (1000); temp.addDespertable(new Perezoso("1")); temp.addDespertable(new Perezoso("2")); temp.start(); //Esperamos 5 sg para interrumpir la alarma try { Thread.sleep(5000); } catch (InterruptedException e) {} temp.interrupt(); // Espero a que termine while (temp.isAlive()); } }
  • 14. El lenguaje de programación Java 14 Ejemplo- salida del programa perezoso.despierta perezoso.despierta perezoso.despierta perezoso.despierta temp.interrupt
  • 15. El lenguaje de programación Java 15 Reflexión en Java • Paquete java.lang.reflect • Incluye las clases: – Field – Method – Constructor • Permite: – Examinar las propiedades de una clase en tiempo de ejecución. – Inspeccionar los objetos en tiempo de ejecución – Utilizar los objetos Method como si fueran punteros a función
  • 16. El lenguaje de programación Java 16 clase Class • public static Class forName(String className) • Field [] getFields() • Field [] getDeclaredFields() • Field getField(String name) • Method [] getMethods • Method [] getDeclaredMethods() • Method getMethod(String name, Class[] parameterTypes) • Constructor [] getConstructors • Constructor [] getDeclaredConstructors() • String getName() • boolean isInstance(Object obj) //equivale instanceof
  • 17. El lenguaje de programación Java 17 clases Field y Method • Clase Field: – public Object get(Object obj) – public Class getType() – public String getName() • Clase Method: – public Class[] getExceptionTypes() – public Class[] getParameterTypes() – public Class getReturnType() – public String getName() – public Object invoke(Object obj, Object[] args) • si obj = null invocamos un método de clase
  • 18. El lenguaje de programación Java 18 Ejemplo: invocar método de clase class Cuenta{ public static Cuenta abrir(Persona titular){ … } } • Invocar al método de clase mediante reflexión: Persona titu = bd.getCliente(“pepito”); Class claseCta = Class.forName(“banco.Cuenta”); Method metodoAbrir = claseCta.getMethod(“abrir", new Class[]{Persona.class}); Cuenta cta = (Cuenta)metodoAbrir.invoke(null, new Object[] {titu});