¿Cómo cerrar de forma segura todas las discusiones antes de la salida

Alexander De Sousa:

Tengo una aplicación que comienza unos pocos hilos, finalmente, un hilo puede necesitar para salir de toda la aplicación, sin embargo otros hilos pueden estar en el medio de una tarea por lo que me gustaría dejarlos continuar su bucle de corriente antes de salir.

En el siguiente ejemplo Thread2 tiene ni idea de cuándo Thread1 está tratando de salida, que sólo sirve para ocultar todo a fin de inmediato.

¿Cómo puedo dejar que Thread2, 3 y 4, etc. terminar sus bucles antes de cerrar?

Editar: Para responder a las preocupaciones de interrogación duplicados: esto varía de la situación típica en la que la clase padre no puede ser responsable de puppeteering los paros, cualquiera de los hilos individuales debe ser capaz de iniciar el cierre hacia abajo.

Edit2: También he dejado una respuesta con lo que terminó haciendo que es una implementación de la respuesta aceptada.

class Scratch {
    public static void main(String[] args) {
        Thread Task1 = new Thread(new Task1());
        Task1.start();

        Thread Task2 = new Thread(new Task2());
        Task2.start();

        // ... more threads
    }

    public class Task1 implements Runnable {
        public void run() {
            while (true) {
                // ...
                System.exit(0);
                // ...
            }
        }
    }

    public class Task2 implements Runnable {
        public void run() {
            while (true) {
                // ...
                // I need to know about System.exit(0) to exit my loop
                // ...
            }
        }
    }
}
HugoTeixeira:

Puede utilizar una volatile booleanvariable que todas las discusiones van a comprobar constantemente. Si un hilo establece el valor de esa variable a false, todas las discusiones van a ver el nuevo valor y salir del whilebucle.

Explicación : las operaciones de lectura / escritura en volatilelas variables son atómicos. Además de eso, el valor de las variables volátiles no se almacenan en caché, por lo que todas las discusiones ver el mismo valor.

class Scratch {

    private static volatile boolean isRunning = true;

    public static void main(String[] args) {
        Thread Task1 = new Thread(new Task1());
        Task1.start();

        Thread Task2 = new Thread(new Task2());
        Task2.start();

        // ... more threads
    }

    public class Task1 implements Runnable {
        public void run() {
            while (isRunning) {
                // ...
                isRunning = false; // let's stop all threads
                // ...
            }
        }
    }

    public class Task2 implements Runnable {
        public void run() {
            while (isRunning) {
                // ...
                // I need to know about System.exit(0) to exit my loop
                // ...
            }
        }
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=175346&siteId=1
Recomendado
Clasificación