Curso Java. Volumen IV. Gestión de threads

Escrito por Sergio De Luz

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

Últimos análisis

Valoración RZ
7
Valoración RZ
9
Valoración RZ
8
Valoración RZ
8
Valoración RZ
8
Valoración RZ
8
Valoración RZ
10