Foo类实现了Runnable接口
public class Foo implements Runnable{
private boolean isRun ;
@Override
public void run() {
isRun = true;
while (isRun){
System.out.println("runing ......");
}
}
public void stop(){
this.isRun = false;
}
@Override
public String toString() {
return "Foo{" +
"isRun=" + isRun +
'}';
}
}
测试类
public class ThreadTest {
public static void main(String[] args) {
Foo f = new Foo();
Thread t = new Thread(f);
t.start();
f.stop();
System.out.print(f);
}
}
为什么执行了stop()方法之后,t线程没有停止执行呢。
我debug发现thread在运行start()方法之前,里面的Foo对象和执行stop()方法的Foo对象是同一个。按理说执行stop()方法后。f的isRun被设置成了false,线程读取到该变量变成false应该停止才对。
看thread的源码
求大神解答。
t.start(); 并不是离开执行run方法,而是交给OS去调度。
针对你这个例子,执行的顺序是 f.stop() --> System.out.print(f) 也及时调用f对象的toString, 然后才开始线程执行。而在你的run方法中又设置 isRun = true; 所以线程无法停止。
修改Foo 如下:
这个时候你会看到类似这样的输出
说明 stop 确实在 run 之前先执行