Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中的任何一行上打破循环?_Java_Multithreading_While Loop_Break - Fatal编程技术网

如何在java中的任何一行上打破循环?

如何在java中的任何一行上打破循环?,java,multithreading,while-loop,break,Java,Multithreading,While Loop,Break,我想基于某种外部输入(int、string或其他什么)立即终止一个循环,但我不知道它何时到来,java中是否有某种异步方法可以在特定输入到达的确切时刻执行操作 我想做的或多或少的例子: public void run(){ while(/*condition*/){ //let's say it receives a String more times like this: String s = inSocket.readLine();

我想基于某种外部输入(int、string或其他什么)立即终止一个循环,但我不知道它何时到来,java中是否有某种异步方法可以在特定输入到达的确切时刻执行操作

我想做的或多或少的例子:


public void run(){
    while(/*condition*/){

        //let's say it receives a String more times like this:
        String s = inSocket.readLine();

        // and in the bottom, I could put an if:
        if(s.equals("stop")){
        break;
        }
    }

// here some other code that I still want to execute, exiting the cycle

}
在这种情况下,循环只在我写的
break
的那一行停止;我希望它能够立即爆发,任何时候收到的字符串是“停止”,但我不知道什么时候会爆发,因为我在执行过程中收到多个字符串

第二个例子(更清楚):

前面的任何字符串都可以是
stop
,我的问题是
break
总是在第10行执行。 我想在其中一个字符串是
stop
之后立即执行它,我不知道这四个字符串中的哪一个是
stop


我想知道java是否有某种方法可以通过告诉它“小心
stop
”,在第1、3、5、7行中执行
break
;除了在每一个读行之后都放置一个
if
的解决方案之外。

首先,关于您的问题,您没有提供关于您试图创建的
异步
任务的太多信息

我的逻辑是这样的:将
s.equals(“stop”)
置于
while
条件下,最后再次检查
字符串,如下所示:

String s=inSocket.readLine();
而(!s.equalsIgnoreCase(“停止”)){
如果(/*while循环中的条件*/){
}否则{
//中断;
}
s=inSocket.readLine();//再次读取
}
我不确定我是否理解了你的问题,这对你有用吗

这是一个基于您的确切示例的替代方案

String s=inSocket.readLine();
而(/*条件*/){
如果(s.equalsIgnoreCase(“停止”)){
打破
}
//在这里做你的事
s=inSocket.readLine()
//再次阅读,如果停止,将退出。
}

你的想法是对的。事实上,你可以这样做

while(true) {
    String s = inSocket.readLine();

    if(s.equals("stop")) {
        break;
    }

    // Use the value, since it was not "stop"
}

// Execute other code
注意我是如何把支票放在顶部的开头,而不是底部

如果您不喜欢
while(true)
循环,那么“正确”的方法是在定义循环时指定中断条件:

String s;
while(!(s = inStream.readLine()).equals("stop")) {
    // Will not execute/continue running if user entered "stop"
}

// Execute other code

每次用户输入输入时,循环应迭代1次。这意味着所有输入都将被检查为“停止”,假设您没有在循环中再次调用
readLine()

为什么不在(!s.equals(“停止”){if(s.equals(“停止”){}else{}
?如果我理解正确,您希望停止代码在方法中的任意点运行。您可以使用具有易失性布尔值的线程来指示线程应该停止,然后使用大量断点来监视此布尔值。但我认为完全按照你的要求去做是不可能或不可取的。@MaxAlexander是的,我不是天才,所以我想确定这一点;唯一的办法就是提出很多假设then@PhillAlexakis碰巧我必须连续读两遍
s
;如果第一个是“停止”,那么我仍然必须读取第二个,而不是立即退出,如果我在
中写入了代码,那么你为什么不1.
读取
2.
while条件
3.
在while结束时读取
?这方面有很多问题。它不会编译,因为您声明了两个同名的局部变量。不确定是否要执行
s=inSocket.readLine()
(重新分配现有变量,而不是创建一个新的局部变量),但即使这样,
while(s.equalsIgnoreCase(“stop”)
也应该是
while(!s.equalsIgnoreCase(“stop”)
,因为在您编写的代码中,只有当用户键入“stop”(向后)时才会执行循环。您的想法是正确的,不过:关于是否应该停止循环的逻辑更适合在循环的条件部分中定义。您需要嵌套赋值:
while(!(s=inSocket.readLine()).equalsIgnoreCase(“stop”)
-但是正如您所看到的,乍一看,这并不容易理解。我添加了第二个示例,应该更清楚;我的问题是,如果我是正确的,这只能适用于一个字符串,但正如我在while的主体中所说的,我需要有更多的读线,它们必须在主体中都在一起,我不能将它们分开是的,我缺少了一个
while(!equalsIgnoreCase(“stop”)
中,这与我的示例有什么区别?@PhillAlexakis您的代码显示
while(s.equalsIgnoreCase(“stop”)
。即使你解决了这个问题,我的第二种方法显然与你的不同。。即使是第一个调用也不同,只有1个
readLine
call,而不是2个。当我不仅告诉OP他是对的(而不是像你的回答那样建议他需要一个新的结构),而且我发布工作代码并给出一个与你的示例不匹配的替代方案时,你怎么问“有什么区别?”?这与您的示例之间存在巨大差异。似乎你的回答给他留下了更多的问题。我完全理解你的意思,当然最好是内联的,但输出是same@PhillAlexakis它的输出与第一个示例不同(直到您更改它)。即使一开始它是对的(事实并非如此),我的两个建议都比你的两个更干净;可读性很重要。你不能发布被窃听的代码,然后试着质问为什么其他人给出答案来与你竞争。。你的代码被窃听了,即使在修复之后,它在逻辑上也不健全。您不需要使用
if
再次检查条件(整个“while循环中的条件”)。你没有测试你的答案,你没有仔细检查它是否有意义。为什么要问我的答案?
String s;
while(!(s = inStream.readLine()).equals("stop")) {
    // Will not execute/continue running if user entered "stop"
}

// Execute other code