【问题标题】:How to stop a running Thread using a boolean flag is not working如何使用布尔标志停止正在运行的线程不起作用
【发布时间】:2017-09-17 07:50:08
【问题描述】:

我有这个代码 sn-p。当我尝试匹配if 语句中的条件时,如果满足,则应将running 布尔值设置为false。但它(Thread)仍在工作。谁能告诉我我正在做的错误?

    public void timer() {

        new Thread() {
            @Override
            public void run() {
                int min = 1;
                int sec = 10;
                System.out.println("--- " + min + " Minutes and " + sec + " Seconds ---");
                boolean running = true;
                while (running) {
                    System.gc();
                    try {                        
                        for (int i = sec; i <= 60; i--) {
                            if (i >= 0) {
                                System.out.println(min + " Minutes and " + i + " Seconds"); 
                                Thread.sleep(1000);
                            } else {
                                i = 60;
                                min--;
                                if (min < 0) { //condition I'm checking
                                    System.out.println("OOOOOOOOOOOOOKKKKKKKKKKKKKKKKKKKKKKKKK"); 
                                    running=false; //while loop should be false and thread should not run anymore
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

一切正常。 (甚至“OKKKKKKKKK...”也在打印),但running 没有设置为false

【问题讨论】:

  • running 肯定被设置为 false,你永远无法再次测试 while 条件。使用标记为break 甚至return 退出会更容易。你的 for 循环永远不会终止。
  • 问题在于您将i 设置为60。这意味着您将再重复for 循环60 次......再一次......一次又一次。你永远不会回到while(running) 测试。
  • 非常感谢@StephenC 先生的帮助
  • 谢谢@pvg 先生

标签: java multithreading


【解决方案1】:

一开始,你设置i = min (10)
那么您正在打印并等待if (i &gt;= 0)
然后你设置i = 60;
并且在整个时间i 正在减少(i--)。
请注意,i 将是 i &lt;= 60;,因为 for 循环将永远检查
因此,running 将是 false,但永远不会在 while 循环中检查

尝试增加i,无论你想要做什么:)

【讨论】:

    【解决方案2】:

    您的程序逻辑中存在问题,您在 for 循环中将运行变量的值设置为 false 并重置 i = 60 的值 - 运行变量值设置为 false 但控制器永远不会返回到 while 循环,因此线程永远不会终止

    检查这个添加的break语句做的伎俩和控制返回到while循环和线程成功终止

           new Thread() {
                @Override
                public void run() {
                    int min = 1;
                    int sec = 10;
                    System.out.println("--- " + min + " Minutes and " + sec + " Seconds ---");
                    boolean running = true;
                    while (running) {
                        System.gc();
                        try {                        
                            for (int i = sec; i <= 60; i--) {
                                if (i >= 0) {
                                    System.out.println(min + " Minutes and " + i + " Seconds"); 
                                    Thread.sleep(1000);
                                } else {
                                    i = 60;
                                    min--;
                                    if (min < 0) { //condition I'm checking
                                        System.out.println("OOOOOOOOOOOOOKKKKKKKKKKKKKKKKKKKKKKKKK"); 
                                        running=false; //while loop should be false and thread should not run anymore
                                    break;
                                    }
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多