Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + Tecnología especializada
DXST - SAST - IAST - SCA - DevSecOps
Caja blanca - Caja gris - Caja negra
Atacando Aplicaciones Web, APIs, Apps Móviles,
Cliente Servidor, Servidores, Redes, Dispositivos IoT
IoT SCI: Sistemas de Control Industrial

Detener Hilos

Nuestros ethical hackers explican que son los hilos o threads en una aplicación, además explican, mediante un ejemplo, cual es la manera adecuada de detener su ejecución en una aplicación realizada en Java ya que los métodos stop y suspend se consideran inseguros.

Necesidad

Detener hilos de manera segura en Java.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está aprovechando la característica de múltiples hilos de Java.

  2. Se debe detener algún hilo de la aplicación.

Solución

Se entiende por hilos o threads a una secuencia de tareas encadenadas, es decir, tareas que se ejecutan simultáneamente de manera independiente. Los hilos poseen un estado de ejecución y pueden sincronizarse entre ellos para evitar problemas de compartición de recursos. Por ejemplo, si dos hilos necesitan acceder a un recurso, entre ellos mismos "negocean" cuál de los ha de acceder primero. Generalmente, cada hilo tiene una tarea específica y determinada, como forma de aumentar la eficiencia del uso del procesador.

Los hilos tienden a ser usados para realizar trabajos interactivos y en segundo plano, para el procesamiento asíncrono, la aceleración de la ejecución de un sistema, y la estructuración modular de los programas.

En esta solución se verá la manera adecuada de detener los hilos o threads de forma segura en una aplicación Java.

  1. Usualmente, para poder utilizarlos en Java es necesario crear clases que extienden a la clase Thread, y reescribir el método principal run(). El método run(), por lo general, es el que se va a ejecutar principalmente al iniciar un hilo o Thread.

  2. Entonces, en una aplicación donde se utilicen los hilos, es muy factible que exista la necesidad de detener las tareas que están realizando estos threads. Para eso se suelen usar los métodos stop() y suspend(). No obstante el uso de estos métodos es considerado obsoleto por Java ya que son inseguros, por ende no se deberían usar.

  3. Por tanto, se recomienda que la mayoría de usos del método stop() deben ser reemplazados por código que simplemente modifique alguna variable para indicarle al hilo que debería dejar de ejecutarse. Entonces, el hilo debe revisar el valor de esta variable regularmente, y retornar de su método run() si la variable le indica que debe detenerse. Esta variable debe ser volatile.

  4. Por ejemplo, suponiendo que la aplicación contiene el siguiente código.

    hilo.java
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    private Thread blinker;
    
    public void start() {
      blinker = new Thread(this);
      blinker.start();
    }
    public void stop() {
      blinker.stop(); // INSEGURO!
    }
    public void run() {
      Thread thisThread = Thread.currentThread();
      while (true) {
        try {
          thisThread.sleep(interval);
        }
      catch (InterruptedException e){}
        repaint();
      }
    }
    
  5. Se puede evitar el uso del método stop() de la siguiente manera.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    private volatile Thread blinker;
    
    public void stop() {
      blinker = null;
    }
    public void run() {
      Thread thisThread = Thread.currentThread();
      while (blinker == thisThread) {
        try {
          thisThread.sleep(interval);
        }
      catch (InterruptedException e){}
        repaint();
      }
    }
    



Haz un comentario

Estado de los servicios - Términos de Uso