Как я могу выйти из цикла на любой строке, которую я хочу в java? - PullRequest
0 голосов
/ 08 мая 2020

Я хочу немедленно завершить цикл на основе какого-либо внешнего ввода (int, string или чего-то еще), но я не знаю, когда он появится, есть ли какой-то асинхронный метод в java, чтобы действовать в точный момент, когда приходит указанный c ввод?

Пример более или менее того, что я хочу сделать:


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; Я хочу, чтобы он мог немедленно выйти из строя, в любое время, когда полученная строка будет «стоп», но я не знаю, когда это произойдет, поскольку я получаю несколько строк во время выполнения.

Второй пример (подробнее clear):

while(true){
    /*line 0*/ String A = inSocket.readLine();
    /*line 1*/
    /*line 2*/ String B = inSocket.readLine();
    /*line 3*/
    /*line 4*/ String C = inSocket.readLine();
    /*line 5*/
    /*line 6*/ String D = inSocket.readLine();
    /*line 7*/

     if(/*A or B or C or D is "stop" */ ){
    /*line 10*/ break;
        }
}

Любая из предыдущих строк может быть stop, моя проблема в том, что break всегда будет выполняться в строке 10. Я хочу выполнить его немедленно после одной из этих строк stop, и я не знаю, какая из четырех строк будет stop.

Мне интересно, есть ли у java какой-нибудь метод, который может break в строках 1,3,5,7 просто говоря "остерегайтесь stop"; кроме решения поставить if после каждой строки readLine.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Прежде всего, в своем вопросе вы не предоставляете много информации о задаче asynchronous, которую пытаетесь создать.

В моем журнале c сказано следующее: поместите s.equals("stop") в while и снова проверьте string в конце, например:

String s = inSocket.readLine();

while (!s.equalsIgnoreCase("stop")) {

 if ( /*Your condition in while loop*/ ) {

 } else{
     //break; 
 }

  s = inSocket.readLine(); //read again
}

Я не уверен, понял ли я вашу проблему, работает ли это для вас?

Это альтернатива, основанная на вашем точном примере

String s = inSocket.readLine();
while ( /*Condition*/ ) {

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

 //do your stuff here

  s = inSocket.readLine()
 //read again, if it's stop, will quit.
}
0 голосов
/ 08 мая 2020

Вы правильно поняли. Фактически, вы могли бы просто сделать

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

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

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

// Execute other code

Обратите внимание, как я поставил чек в начале вверху, а не внизу.

Если вы не поклонник while(true) циклов, «правильный» способ сделать это - указать условие разрыва при определении l oop:

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

// Execute other code

l oop должен повторяться 1 раз каждый раз, когда пользователь вводит ввод. Это означает, что весь ввод будет проверен на «стоп», если вы не вызовете readLine() снова в l oop.

...