【问题标题】:For and While LoopFor 和 While 循环
【发布时间】:2014-02-01 23:05:45
【问题描述】:

我有一个同时运行的程序,我遇到了这个问题,我想停止线程,但是一旦我点击进入,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 方法导致变量处理 == false,因此在控制台中输入某些内容后,while 循环是否不会中断?
  • 这将无限期地每秒打印一次“字母 i”。

标签: java multithreading loops


【解决方案1】:

我不太清楚你在问什么。但是,如果您希望 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++){

这意味着只要processingtruefor 循环就会继续。

注意:这些解决方案仍然不会在 sleep(1000) 进行时测试 processing。所以程序在终止前仍然可以暂停最多 1 秒。如果您真的想要一个终止sleep 的解决方案,您将使用interrupt 或其他一些并发功能。

【讨论】:

  • 你不是说if (!processing)吗?
  • 真的解释得很透彻并解决了问题。谢谢一堆@HotLicks,我也意识到了这一点,只是把(处理==假)
  • @fastcodejava - 关键是将上述序列插入到内部for 循环中,以便在每次迭代时对其进行检查。
【解决方案2】:

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

【讨论】:

  • 是的,for 循环工作正常,只是一旦我按 Enter 键并将其输入控制台,线程就不会像应有的那样停止。我尝试取出 for 循环并注意到现在线程确实在输入 'enter' 时停止。
  • 你等了一会儿吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多