java多线程,不同runnable之间可以在运行时改变对方的静态成员变量吗?

发布于 2022-09-04 02:56:40 字数 1356 浏览 40 评论 0

我想在主线程里启用两个线程,这两个线程采用两个不同实现的Runnable对象,记作A和B。
我的意图是当采用B的线程运行完成后通知A线程,首先我尝试了如下设计:

class Run {
    
    public static void main(String[] args) {
        new Thread(new A()).start();
        new Thread(new B()).start();
    }
}

class A implements Runnable {
    public static volatile boolean isStop = false; // 标记B是否完成运行
    
    public void run() {
        while(**! isStop**) { //B结束后A跳出循环
            do sth;
        }
        System.out.println("B has stopped.")
    }
}

class B implements Runnable {
  
    public void run() {
       do sth;
       **A.isStop = true**; // 准备退出,将A中的标志变量改为true
    }
}

然而之后在启动这两个线程后,B结束后A仍在循环,即A读到的isStop依然为false.

之后我尝试将isStop变量改到main方法所在类中,大体设计如下:

class Run {
    public static volatile boolean isStop = false; // 标记B是否完成运行
    
    public static void main(String[] args) {
        new Thread(new A()).start();
        new Thread(new B()).start();
    }
}

class A implements Runnable {
      
    public void run() {
        while(**! Run.isSto**p) { //B结束后A跳出循环
            do sth;
        }
        System.out.println("B has stopped.")
    }
}

class B implements Runnable {
    public void run() {
       do sth;
       **Run.isStop = true;** // 准备退出,将Run中的标志变量改为true
    }
}

这样可以正常完成通知过程。但我不明白为什么会是这个结果?原理上跟先前的尝试有何不同?

提前谢过大家!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文