El documento habla sobre hilos en Java. Explica que un hilo es un flujo de ejecución y que su uso conlleva riesgos de concurrencia. Describe cómo definir e iniciar un hilo que herede de Thread o implemente Runnable. También cubre el ciclo de vida de los hilos, la interrupción, el bloqueo con sleep, y la necesidad de sincronización para evitar inconsistencias al acceder a datos compartidos.
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 El lenguaje de programación Java perezoso.despierta perezoso.despierta perezoso.despierta perezoso.despierta temp.interrupt
15.
16.
17.
18.
Notas del editor
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.
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 public void run(){ try{ .. while (!interrupted() && tenga trabajo por hacer){ //trabajar } }catch (InterruptedException e){ //thread was interrupted during sleep or wait } //termina el método run y por tanto el hilo de ejecución }
Etiquetar cualquier operación que no debe ser interrumpida con synchronized