For和While Loop

时间:2014-01-14 00:49:21

标签: java multithreading loops

我有一个同时运行的程序,我有这个问题,我想停止线程,但是一旦我点击进入,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循环导致程序关闭?

2 个答案:

答案 0 :(得分:2)

我不清楚你在问什么。但是,如果您希望whilefor循环在processing设置为true后立即终止,则不会发生这种情况。 while将执行正文中的语句(即for循环),然后它将测试条件(processing == true),如果它是真的,它再次执行语句,然后再次测试条件。在for循环执行时,它不会测试它。设置processing变量时,它不会“注意到”。因此,当processing设置为true时,for循环将一直持续到完成为止,这可能是另外26秒。

要解决此问题,请添加

if (!processing)
    break;

for循环内。现在,每次processing循环都会测试for标志。 (如果是我,我会在while循环上放置一个“标签”,并将其用于两个循环中的break。)另一种解决方法:

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

这意味着只有forprocessingtrue循环才会继续。

注意: processing正在进行时,这些解决方案仍然无法测试sleep(1000)。因此程序在终止之前仍然可以暂停1秒钟。如果您真的想要一个终止sleep的解决方案,那么您将使用interrupt或其他一些并发功能。

答案 1 :(得分:1)

它应该工作。您的for循环大约需要27秒才能完成。在for循环结束后,它应该出来了。