线程手动停止出错,程序进入死循环

线程无法手动停止
public class TestStop implements Runnable{
    public boolean flag=true;
    @Override
    public void run() {
        int i=0;
        while (flag){
            System.out.println("run......."+i++);
        }
    }
    public void stop(){
        this.flag=false;
    }

    public static void main(String[] args) {
        TestStop ts=new TestStop();
        ts.run();
        for (int i = 0; i < 1000; i++) {
            System.out.println("main"+i++);
            if (i==90){
                ts.stop();
            }
        }
    }
}

程序会进入死循环无法停止

求解答,可能是变量flag的问题,导致一直死循环
运行截图

img

有几个问题
第一你这不是启动线程的方法,线程需要通过Thread类封装任务类来执行Start()方法,而你执行Run相当于单线程顺序执行,
第二你的遍历连续执行两次i++;永远不会出现90所以变量值不会出现false,也不会使得子线程停止
第三可以在变量加上volatile,保证可见性。
代码重新调整

public class TestStop implements Runnable{
    public volatile boolean flag=true; //可见性
    @Override
    public void run() {
//        try {
//            TimeUnit.SECONDS.sleep(2);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        int i=0;
        while (flag){
            System.out.println("run......."+i++);
        }
    }
    public void stop(){
        this.flag=false;
    }
 
    public static void main(String[] args) {
        TestStop ts=new TestStop();
        //ts.run(); //这不是启动一个线程而是执行run方法
        new Thread(ts).start(); //启动线程
        for (int i = 0; i < 1000; i++) {
           // System.out.println("main"+i++); //两次 i++,永远不会得到90
            System.out.println("main"+i);
            if (i==90){
                ts.stop();
            }
        }
    }
}

ts.run()并不是启动子线程,单纯只是在主线程里跑run方法罢了,所以导致后面的主线程for循环根本没执行,if(i==90)自然也就没执行。
改成下面这样

public class TestStop implements Runnable{
    public volatile boolean flag=true;
    @Override
    public void run() {
        int i=0;
        while (flag){
            System.out.printf("【%s】:run.......%d \n", Thread.currentThread().getName(), i++);
        }
    }
    public void stop(){
        this.flag=false;
    }

    public static void main(String[] args) {
        TestStop ts=new TestStop();
//        ts.run();
        new Thread(ts).start();
        for (int i = 0; i < 200; i++) {
            System.out.printf("【%s】:main %d \n", Thread.currentThread().getName(), i);
            if (i==90){
                ts.stop();
            }
        }
    }
}

你用的是单线程,你的ts.run();这一行,不运行完的话,下面的代码是不会走的,因为你的run方法会一直跑,永远不会结束,你应该在run方法里面去调stop()

img

你的每个线程都没有加sleep,这导致程序执行的太快了,而且很容易造成线程阻塞
给主线程的循环和子线程的循环都加个sleep再试

Runnable接口实现多线程的方式
实现Runnable接口
重写run方法
创建Thread对象,将刚刚创建好的runnable的子类实现作为thread的构造参数
通过thread.start()进行启动
你这个不是多线程所以会一直循环