Curso Java. Volumen IV. Gestión de threads

Escrito por Sergio De Luz
Java
0

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.

public class GestionThreads {</p>
<p>public static void main(String[] args) {</p>
<p>Thread t = Thread.currentThread();</p>
<p>System.out.println(&quot;Paso 1: Estado del thread--&gt; :t.isAlive()=&quot; + t.isAlive());</p>
<p>System.out.println(&quot;Paso 1: Estado del thread--&gt; t.isInterrupted()=&quot; + t.isInterrupted());</p>
<p>t.interrupt();</p>
<p>System.out.println(&quot;Paso 2: Estado del thread--&gt; t.isInterrupted()=&quot; + t.isInterrupted());</p>
<p>System.out.println(&quot;Paso 2: Estado del thread--&gt; :t.isAlive()=&quot; + t.isAlive());</p>
<p>System.out.println(&quot;Paso 3: Estado del thread--&gt; t.isInterrupted()=&quot; + t.isInterrupted());</p>
<p>System.out.println(&quot;Paso 3: Estado del thread--&gt; :t.isAlive()=&quot; + t.isAlive());</p>
<p>t.interrupt();</p>
<p>try {</p>
<p>Thread.sleep(2000);</p>
<p>System.out.println(&quot;El thread no ha sido interrumpida&quot;);</p>
<p>} catch (InterruptedException e) {</p>
<p>System.out.println(&quot;El thread sí ha sido interrumpido&quot;);</p>
<p>}</p>
<p>System.out.println(&quot;Paso 4: Estado del thread--&gt; :t.isInterrupted()=&quot; + t.isInterrupted());</p>
<p>System.out.println(&quot;Paso 4: Estado del thread--&gt; :t.isAlive()=&quot; + t.isAlive());</p>
<p>}</p>
<p>}

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!.