2014-01-14 257 views
5

我有一个同时运行一个程序,我有这个问题,我想停止线程,但for循环/ while循环没有被取消,一旦我一次,我点击进入For和While循环

如果我取出while循环中的for循环,程序实际上响应输入并关闭。

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循环导致程序关机?

+0

顺便说一句,它不应该说(虽然处理==真),而只是while(处理)。此外,while循环不会因为调用使得变量处理== false而使用的permSleep方法而在控制台中输入某些内容而中断? – JavaNewb

+0

无限期地,每秒打印一次“Letter i”。 –

回答

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++){ 

这意味着for循环只会继续只要processingtrue

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

+2

你是不是指'if(!processing)'? –

+0

是的,谢谢.... – ajb

+0

真的解释彻底,它解决了这个问题。感谢@HotLicks我也意识到这一点,只是把(处理== false) – JavaNewb

1

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

+2

是的for循环工作正常,只是一旦我输入并输入到控制台,线程不会像它应该停止。我试着拿出for循环,注意现在线程在输入'enter'时停止。 – JavaNewb

+0

你等了一会儿吗? – fastcodejava