大佬们帮忙看下,刚刚学线程的终止,为什么写完之后不能准确终止线程呢?
public class TestThread08 {
public static void main(String[] args) throws InterruptedException {
MyThread5 m5 =new MyThread5();
Thread t =new Thread(m5);
t.setName("睡眠线程");
t.start();
//5秒后终止线程
Thread.sleep(5000);
m5.run = false;
}
}
class MyThread5 implements Runnable{
public boolean run = true;
@Override
public void run() {
if(run == true){
for(int i=0; i<10; i++){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"-->"+i);
} catch (InterruptedException e) {
//e.printStackTrace();
}
}
}else {
return;
}
}
}
第一:你这里有两条线程,一条是main、另外一条是你启动的(假设为 A)。那么在main中更改run的值对于A是不可见的,所以你改了A也不知道(如果想让A知道在run 和 boolean 之间加上volatile关键字)
第二:Thread.sleep睡眠的是当前线程(也就main),t.start()A线程已经启动了,已经过了if语句,你这个时候再设置为false没用。
你要把run作为循环条件一部分,这样你加的run才有用
把if去掉
把for的结束条件改为i<10 && run