For和While循环
我有一个同时运行一个程序,我有这个问题,我想停止线程,但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
循环导致程序不关机?
我不是很清楚你在问什么。但是,如果您希望while
和for
循环都会在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
循环只会继续只要processing
是true
。
注意:这些解决方案仍然不会测试processing
而sleep(1000)
正在进行。所以程序在终止之前可能暂停1秒钟。如果您真的想要一个解决方案来终止sleep
,那么您将使用interrupt
或其他一些并发功能。
它应该工作。您的for
循环需要大约27
秒才能完成。在for
循环结束后它应该出来。
是的for循环工作正常,只是一旦我输入并输入到控制台,线程不会像它应该停止。我试着拿出for循环,注意现在线程在输入'enter'时停止。 – JavaNewb
你等了一会儿吗? – fastcodejava
顺便说一句,它不应该说(虽然处理==真),而只是while(处理)。此外,while循环不会因为调用使得变量处理== false而使用的permSleep方法而在控制台中输入某些内容而中断? – JavaNewb
无限期地,每秒打印一次“Letter i”。 –