Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porPriscila Francisco Modificado hace 10 años
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
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(); Cuando se crea un objeto de clase Thread, el método run no se llama automáticamente. Se invoca con una llamada a start. NO LLAMAR A RUN DIRECTAMENT, solo a través de 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(); public void run(){ .. while (no me pidan que interrumpa && tenga trabajo por hacer){ //trabajar } //termina el método run y por tanto el hilo de ejecución o bien try{ while (!interrupted() && tenga trabajo por hacer){ }catch (InterruptedException e){ //thread was interrupted during sleep or wait El lenguaje de programación Java
6
El lenguaje de programación Java
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
El lenguaje de programación Java
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
El lenguaje de programación Java
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(); ... } Etiquetar cualquier operación que no debe ser interrumpida con synchronized 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
El lenguaje de programación Java
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
El lenguaje de programación Java
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
El lenguaje de programación Java
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
El lenguaje de programación Java
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 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}); El lenguaje de programación Java
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.