style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Threads Metodos Obsoletos

El motivo de la publicacion de este post sobre estos metodos obsoletos:  suspend(), stop(), resume() algunos de mis maestros aun los siguen implementando no se el motivo del por que y quisiera darles una explicacion del por que son obsoletos ami mis maestros y ala vez compartirlo con mis compañeros.

Se que algunos de estos fueron sustuidos por:  wait(), notify(), notify all(), interrupt() y por que fueron sustituidos por los metodos anteriormente mencionados.

Saludos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Explicación

En el mismo Javadoc de 1.6 viene la explicación de cada uno.

suspend() y resume() causan problemas de deadlocks, porque permiten suspender o reanudar la ejecución de un Thread de manera inmediata, incluso si está ejecutando una sección crítica de código, por lo que cualquier otro Thread que quiera ejecutar dicha sección tiene que esperar hasta que el primer Thread sea revivido, pero eso podría no pasar nunca, y además si ese segundo Thread necesita entrar a la sección crítica para poder revivir al primer Thread, DEADLOCK!

stop() detiene al Thread que recibe dicho mensaje de inmediato. Si el Thread estaba ejecutando una sección crítica de código, de todas maneras se interrumpe y los monitores que protegen dicha sección se liberan, pero como no se terminó de ejecutar esa sección, puede estar en un estado inconsistente.

La explicación completa está en el sitio de Oracle.

Imagen de ezamudio

Nuevo esquema

Lo recomendable ahora es que en vez de suspend() utilices interrupt(), que simplemente modifica una bandera en el receptor, misma que se puede verificar para saber si se continúa la ejecución o no. Por ejemplo si tienes un ciclo muy largo, puedes simplemente revisar esa bandera y cachar la excepción correspondiente si es que usas wait() o sleep():

while (!Thread.interrupted()) { //o puedes usar Thread.currentThread().isInterrupted() es igual
  //hacer cosas
  try {
    Thread.sleep(100); //o un wait() sobre algun objeto pero dentro de un synchronized(objeto)
  } catch (InterruptedException ex) {
    //limpiar lo que necesites, saliendo de aqui ya no vas a volver a entrar al while
  }
}

Si al Thread que está ejecutando el código anterior le envías el mensaje interrupt() entonces se marca como interrumpida, si es que estaba en la sección de hacer cosas; si estaba en el sleep() o wait(), se revive el Thread para que se ejecute el código que cacha la InterruptedException. Todo esto en vez de suspend() o stop(). Y como dije antes, resume() existe solamente como complemento de suspend() y por lo tanto si no usas uno, no necesitas el otro.

Imagen de JaimeItlzc

wait()

Pero si por ejemplo tengo un Thread en ejecuacion y lo suspendo pero en determinado momento lo quiero reanudar:

Por ejemplo: Un Thread que va imprimiendo Jaime letra por letra y lo suspendo por decirlo asi en la letra i y quiero reanudarlo con algun evento.
1.- Aplicaria el metodo suspend()  y resume()
2.- Aplicaria el metodo wait() y notify()

Que seria mejor el 1 o el 2.
Saludos.
De antemano gracias por responder ami duda .

Imagen de JaimeItlzc

Ejemplo de Letras

  private void suspendNow() { //Suspendo el Thread
    if (runThread != null) { // evitar NullPointerException
      runThread.suspend();
    }
  }

  private void resumeNow() { //Con este metodo reanudo el Thread
    if (runThread != null) { // evitar NullPointerException
      runThread.resume();
    }
  }

  public void run() {
    try {      
       runThread = Thread.currentThread();
      int count = 0;

      while (true) {
        //Cada vez que pasa, muestra el siguiente símbolo
        symbolTF.setText(symbolList[count % symbolList.length]);
        Thread.sleep(200);
        count++;
      }
    } catch (InterruptedException x) {
      //pasar por alto
    } finally {
      //asegúrese de que la referencia a ella también se pierde.
      runThread = null;
    }
  }

En realidad lo que estoy haciendo esta bien?
El Thread lo suspendo y lo reanudo con un Evento(Jbutton)

Imagen de ezamudio

interrupt()

wait/notify es una manera, otra es con interrupt(). Otra vez: Los métodos suspend() y resume() han sido marcados como obsoletos porque causan muchos problemas de deadlock. En otras palabras, los mismos que diseñaron la clase Thread se dieron cuenta de los problemas que tenían esos dos métodos y por eso los quitaron y ahora recomiendan usar otros mecanismos, como wait/notify o interrupt(); no quitaron los métodos por si los quieres usar, pero es bajo tu propio riesgo.

Imagen de JaimeItlzc

Threads wait/notify

Ok Calificame:

Este es mi Evento:

public synchronized void mousePressed(MouseEvent e) {
        //e.consume();
        threadSuspended = !threadSuspended;
        if (!threadSuspended)
            notify();
       }

Este es mi run:

public void run() {
       int count=0;
     
      runThread=Thread.currentThread();
       while (!Thread.interrupted()) {
          try {
               symbolTF.setText(symbolList[count % symbolList.length]);
               Thread.sleep(200);
               count++;
           synchronized(this) {
            while (threadSuspended)
                 wait();
            }
          } catch (InterruptedException e){
          }
        repaint();
     }
  }

Si puedo mejorar algo hazme saber porfavor te lo agradeceria.
Saludos.

Imagen de ezamudio

InterruptedException

Cuando cachas InterruptedException, se reinicia la bandera de interrupción en el Thread y por lo tanto va a volver a entrar al ciclo de while. Necesitas dentro del catch algo como runThread.interrupt(); por lo demás creo que está bien (no lo voy a compilar y probar obviamente)

Imagen de JaimeItlzc

Gracias Ezamudio

Pues ya me quedaron muchas cosas claras. Esto de los Threads me atrae mucho y estoy en proceso de aprenderlos.

Saludos.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">