如何合理终止线程的终止。

大佬们帮忙看下,刚刚学线程的终止,为什么写完之后不能准确终止线程呢?

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