For 和 While 循环

5
我有一个程序在同时运行,但是我遇到了这样一个问题:当我想要停止线程时,for循环/while循环并没有被取消,一旦我点击回车键。
如果我将for循环从while循环中拿出来,程序实际上会响应回车键并关闭。
class MyNumber extends Thread {

    private volatile boolean processing = true;

    public void run() {
        while (processing) {
            // Once I take this for loop out(put // beside it like right now), the enter key to stop the program then does work.
            //for(int i = 1; i<27; i++){
             System.out.println("Letter " + "i");

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // }
        }
    }

    public void permSleep() {
        processing = false;
    }
}

public class LetterNumber {
    public static void main(String[] args) {
        MyNumber num1 = new MyNumber();
        num1.start();

        System.out.println("Hit enter to stop the Numbers!");
        Scanner shutter1 = new Scanner(System.in);
        shutter1.nextLine();

        num1.permSleep();
    }
}

为什么使用for循环会导致程序关闭?

顺便提一下,它本来不应该写成while(processing == true),而应该是while(processing)。另外,由于调用permSleep方法使变量processing等于false,当在控制台中输入一些东西后,while循环不会中断吗? - JavaNewb
这将无限期地每秒打印一次“字母i”。 - Hot Licks
2个回答

2
我不是很清楚你在问什么。但是,如果你期望当 processing 被设为 true 时,whilefor 循环都会立即终止,那并不是实际情况。一个 while 循环会执行其主体语句(即 for 循环),然后测试条件(processing == true),如果为真,则再次执行该语句,然后再次测试条件。它不会在 for 循环执行时测试条件。它不会“注意到” processing 变量的设置。因此,当 processing 被设为 true 时,for 循环将继续进行,直到完成,这可能需要另外 26 秒。
简单地解决这个问题,只需添加:
if (!processing)
    break;

for循环内。现在每次通过for循环时都会测试processing标志。(如果是我,我会在while循环上放一个“标签”,并使用它来break两个循环。)另一种修复方法:

for(int i = 1; i<27 && processing; i++){

这意味着for循环只会在processingtrue的情况下继续执行。

注意: 这些解决方案在sleep(1000)时仍不会检查processing。因此,程序在终止之前仍可能暂停长达1秒钟。如果您真的想要一个能够终止sleep的解决方案,您需要使用interrupt或其他并发特性。


2
你是不是想说 if (!processing) - Hot Licks
真的很详细地解释了,问题得到了解决。非常感谢@HotLicks,我也意识到了这一点,只需加上(processing == false)即可。 - JavaNewb
@fastcodejava - 关键是将上述序列插入内部for循环中,以便在每次迭代时进行检查。 - Hot Licks

1
它应该能正常工作。您的for循环需要大约27秒才能完成。在for循环完成后,它应该退出。

2
是的,for循环运行得很好,只是一旦我按下回车并将其输入控制台,线程就不会像应该停止那样停止。我尝试去掉for循环,注意到现在线程确实会在输入“enter”时停止。 - JavaNewb
你等了一会儿吗? - fastcodejava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接