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

标签 java

<分区>

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

在下面的示例中,线程 2 不知道线程 1 何时试图退出,它只是强制所有内容立即完成。

如何让线程 2、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
                // ...
            }
        }
    }
}

最佳答案

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

说明:volatile变量的读/写操作是原子的。除此之外,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
                // ...
            }
        }
    }
}

关于java - 如何在退出前安全地关闭所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427939/

相关文章:

java - 从流输入中解析没有根元素的 XML 片段列表

java - TextArea 多色文本

Java程序是空白的

java - 如何以静态方式访问我的 SQLite 数据库?

java - 创建数据库

java - 用户输入的数字格式异常

java - 使用java将driver.wait放置在selenium webdriver中的有效方法

java - 如何配置我的 servlet 来发送 Ajax 请求

java - Redisson客户端setnx

java - 如何在 JTextPane 上设置不同的行?