我想在主线程里启用两个线程,这两个线程采用两个不同实现的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
}
}
这样可以正常完成通知过程。但我不明白为什么会是这个结果?原理上跟先前的尝试有何不同?
提前谢过大家!
光阴似箭催人老,日月如移越少年。