ayuansama 2022-08-02 10:48 采纳率: 57.1%
浏览 45

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

线程无法手动停止
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

  • 写回答

5条回答 默认 最新

  • 皮蛋不吃粥 2022-08-02 11:28
    关注

    有几个问题
    第一你这不是启动线程的方法,线程需要通过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();
                }
            }
        }
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月2日

悬赏问题

  • ¥15 C++ 中std无法跨lib或dll的问题解决方案
  • ¥15 单片机烧录软件stcISP检测不到串口,各种方法都试过了,就是没有,如何解决?
  • ¥15 python culfflinks怎么画图
  • ¥15 idea中的数据库驱动和druid驱动问题
  • ¥15 Arcgis Pro python中如何读取geojson文件
  • ¥50 关于uniapp高德地图当前定位点方向的修正问题
  • ¥15 Arcgis Pro python中如何读取geojson文件
  • ¥15 求一段C语言或C++语言写的CRC-32校验程序
  • ¥15 电脑端如何获取非本机的摄像头高清图片
  • ¥15 C++代码实现将空白光盘设置为U盘模式