java - 为什么我将运行标志设置为 false 后线程仍继续运行?

标签 java synchronization

当标志为 true 时,我有一个线程正在运行,但是当我将标志更改为 false 时,它​​不会死掉。

public static void main(String[] args)
    {
        try
        {
            MyThread mt = new MyThread();
            mt.start();
            Thread.sleep(1000);
            mt.setRunning(false);
            System.out.println("set running false");
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

    public static class MyThread extends Thread
    {
        private boolean isRunning = true;

        public boolean isRunning()
        {
            return isRunning;
        }

        public void setRunning(boolean isRunning)
        {
            this.isRunning = isRunning;
        }

        public void run()
        {
            System.out.println("run");
            while (isRunning == true){
            }
            System.out.println("run over!");
        }
    }

我知道将“isRunning”定义为 volatile 可以解决问题,但是当不是 volatile 时,“isRunning”在某些时候对 MyThread 不应该可见?

最佳答案

这是由于可见性原因。

使变量可变:

volatile private boolean isRunning = true;

参见What is the volatile keyword useful for了解更多详情。

I know defining "isRunning" as volatile will solve the problem,but when not volatile, "isRunning" shouldn't be visible at some point to MyThread?

这是 isRunning 的值更改,当 main 线程更改它时,您需要使 MyThread 可见。否则它可能只是继续看到 true 的缓存值。

关于java - 为什么我将运行标志设置为 false 后线程仍继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56696636/

相关文章:

java - 我们如何将网页表单 html 模板与用户输入的数据一起存储在任何服务器中?

Java RMI-线程的意外行为

python - 数据库同步期间序列化数据的优点

multithreading - 在Metal中同步网格中的所有线程

java - Java原语是在堆栈还是堆上?

java - 设置具有相同的删除,但都不会覆盖另一个错误

java - 删除java中的临时文件

java - 如何将子文件夹请求转换为参数

JavaScript 同步方法

java - 跨多个线程访问字符串