Volvemos con nuestro particular Curso de Java. Si eres nuevo, y acabas de incorporarte, te recomendamos echar un ojo al índice del Curso de Java.
En volúmenes anteriores empezamos a ver la concurrencia en Java, y también vimos como hay una gran diferencia de hacerlo con un hilo a hacerlo con varios hilos. Comprobamos la importancia que tiene el control de las regiones críticas para que el uso de las variables compartidas no nos afecte negativamente a la corrección de nuestro programa.
Hoy vamos a ver algo de teoría de los threads y ejemplos de los mismos.
Un thread tiene varios estados, en el siguiente gráfico podemos ver todos los que tiene y como pasar de uno a otro:
Control de finalización de un Thread:
- final boolean isAlive(): Devuelve un bool, si devuelve “true” el thread se encuentra vivo (alive), sino está vivo devuelve “false”.
- final void join(): Lanza la excepción InterruptedException, suspende el thread que invoca hasta que el thread invocado ha terminado.
- final void join(long milliseg): Igual que el anterior, suspende el thread que invoca hasta que el thread invocado ha terminado o hasta que se cumple el tiempo fijado.
Interrupción de Threads:
- void interrupt(): El thread pasa a estado Interrupted. Si está en Waiting, Joining o Sleeping termina y lanza la excepción InterruptedException. Si está en Runnable cambia su estado a Interrupted.
- Static boolean interrupted(): Devuelve true si el thread que invoca está en estado Interrupted y a continuación lo pasa a estado Runnable.
- Boolean isInterrupted: Devuelve true si el thread está en estado Interrupted, devuelve faslo sino lo está. Con este método no se cambia el estado del thread.
Ahora vamos a poneros unos ejemplos para que veáis el uso de estos métodos.
[java]public class GestionThreads {</p>
<p>public static void main(String[] args) {</p>
<p>Thread t = Thread.currentThread();</p>
<p>System.out.println("Paso 1: Estado del thread–> :t.isAlive()=" + t.isAlive());</p>
<p>System.out.println("Paso 1: Estado del thread–> t.isInterrupted()=" + t.isInterrupted());</p>
<p>t.interrupt();</p>
<p>System.out.println("Paso 2: Estado del thread–> t.isInterrupted()=" + t.isInterrupted());</p>
<p>System.out.println("Paso 2: Estado del thread–> :t.isAlive()=" + t.isAlive());</p>
<p>System.out.println("Paso 3: Estado del thread–> t.isInterrupted()=" + t.isInterrupted());</p>
<p>System.out.println("Paso 3: Estado del thread–> :t.isAlive()=" + t.isAlive());</p>
<p>t.interrupt();</p>
<p>try {</p>
<p>Thread.sleep(2000);</p>
<p>System.out.println("El thread no ha sido interrumpida");</p>
<p>} catch (InterruptedException e) {</p>
<p>System.out.println("El thread sí ha sido interrumpido");</p>
<p>}</p>
<p>System.out.println("Paso 4: Estado del thread–> :t.isInterrupted()=" + t.isInterrupted());</p>
<p>System.out.println("Paso 4: Estado del thread–> :t.isAlive()=" + t.isAlive());</p>
<p>}</p>
<p>}[/java]
Salida por pantalla:
Paso 1: Estado del thread–> :t.isAlive()=true
Paso 1: Estado del thread–> t.isInterrupted()=false
Paso 2: Estado del thread–> t.isInterrupted()=true
Paso 2: Estado del thread–> :t.isAlive()=true
Paso 3: Estado del thread–> t.isInterrupted()=true
Paso 3: Estado del thread–> :t.isAlive()=true
El thread sí ha sido interrumpido
Paso 4: Estado del thread–> :t.isInterrupted()=false
Paso 4: Estado del thread–> :t.isAlive()=true
Podéis «jugar» con los distintos métodos para cambiar el thread de estado.
En el próximo volumen, nos metemos de lleno con los llamados «Monitores», ¡os esperamos!.