如何在退出前安全关闭所有线程

Ale*_*usa 6 java

我有一个启动几个线程的应用程序,最终一个线程可能需要退出整个应用程序,但是其他线程可能处于任务中间,所以我想让它们在退出之前继续当前循环。

在下面的示例中,线程 2 不知道线程 1 何时尝试退出,它只是强制一切立即完成。

我怎样才能让 Thread2、3 和 4 等在关闭之前完成它们的循环?

编辑:为了解决重复的问题:这与父类不能负责操纵关闭的典型情况不同,任何单个线程都必须能够启动关闭。

Edit2:我还留下了我最终做的答案,这是已接受答案的实现。

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
                // ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Hug*_*ira 3

您可以使用volatile boolean所有线程都会不断检查的变量。如果一个线程将该变量的值设置为false,则所有线程都将看到新值并退出while循环。

说明volatile变量中的读/写操作是原子的。除此之外,易失性变量的值不会被缓存,因此所有线程都会看到相同的值。

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
                // ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)