java - 如何正确使用 volatile 来杀死线程?

标签 java multithreading volatile

我阅读了许多“如何在 Java 中终止线程”主题,发现一种方法是使用 boolean volatile 变量来指示线程是否应继续运行,但我还没有看到解释如何使用它的答案在两个类(底层和 Runnable)中正确变量

根据我现在的理解,我会这样做:

public class Server {

    private volatile boolean isRunning = true;

    public Server(...) { }

    public static void main(...)
        ...
        new Thread(new Process(isRunning)).start();
        ...
    }

    public void shutdown() {
        isRunning = false;
    }

}

public class Process implements Runnable {

    private volatile boolean isServerRunning;

    public Process(boolean isServerRunning) {
        this.isServerRunning = isServerRunning;
    }

    @Override
    public void run() {
        ...
        while(isServerRunning) {...}
        ...
    }

}

我的问题:我是否应该像我正在做的那样将 isRunning 变量作为参数提供给线程的 Runnable?而且在 Runnable 类中,我应该将这个变量定义为 volatile 吗?还有什么要修改以使代码更好吗?

最佳答案

您的代码复制了 isRunning 变量的值。 See a question about this.

您要么 - 要么需要提供整个 Server 以运行,或者让进程以其他方式引用 Server 的 isRunning 字段。

例如

public class Server ... {
    private volatile boolean isRunning = true;
    public boolean isRunning() { return this.isRunning; }
    ...
}

public class Process implements Runnable {

    private final Server server;

    public Process(Server server) {
        this.server = server;
    }

    @Override
    public void run() {
        ...
        while(server.isRunning()) {...}
        ...
    }

}

说明:Runnable 的线程调用isRunning,它访问volatile 变量,因此您始终获得新值。

备选方案:使用同步,保护对服务器字段的写入/读取。您的 PoV 的结果是相同的。

备选方案 2:在服务器中使用 AtomicBoolean,您可以传递对它的引用,而不是整个服务器。虽然不会这样做,但它闻起来有点像暴露(服务器的)内部结构恕我直言。

关于java - 如何正确使用 volatile 来杀死线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47101494/

相关文章:

java - java 新手 - 线程 “main” java.util.NoSuchElementException 中出现异常

Java - TCP - 多线程服务器 - 如何处理多个客户端连接?

java - 对 volatile 的写入是 Java 中的内存屏障吗

c# - 读写装箱双值线程安全且无锁?

java - 打开 IReport 收到错误消息 - "Cannot find java exe."

java - 警告 : Error while registering Oracle JDBC Diagnosability MBean

java - 如何禁用Jetty11中的jetty图标

c - C中线程同步和条件变量的问题

multithreading - Java线程安全v从单独的线程显示对话框

java - 对 volatile 关键字的一点说明