java多线程,不同runnable之间可以在运行时改变对方的静态成员变量吗?
我想在主线程里启用两个线程,这两个线程采用两个不同实现的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
}
}
这样可以正常完成通知过程。但我不明白为什么会是这个结果?原理上跟先前的尝试有何不同?
提前谢过大家!
相关阅读:
elementUi 能基于全局的Vue对象使用它的组件吗?
几个关于jsp的问题
通不过HTTPS怎么破?
angular1 directive 如何操作dom实现后台管理系统的折叠导航?
object.__setattr__和直接设置属性有什么不同吗?
jquery click获取该条json数据
atom有什么插件可以提示es6 import进当前文件却没被使用到的
两个js function 互相调用引发的其中一个未定义的问题。
为什么在函数中用createElement创建的元素,函数结束后不能访问,为null,而在下一个函数中却能访问?
skrollr.js的p是什么意思
移动端简单的picker demo,ios和android chrome兼容,android微信里不兼容
为什么刷新页面会导致表单重复提交呀,
如何用vim实现快速整理编号
iOS 开发单元测试,大家开发过程中常用吗,网上资料看了不少,但还是没明白怎么使用,怎么实战呢?
查询某张表的全部数据,这两种方式有区别吗?
wordpress 文章评论实现 ajax 的方法
@RequestParam 获取参数值有问题
在js或css文件后面加上"_日期"起到什么作用呢?
求java md5工具类和php md5工具类通用版
关于bootstrap导航栏下的巨幕