Мои испытания, похоже, не подтверждают ваши выводы. Он работает как ожидалось!
Я написал следующий демонстрационный код
public class DemoThread extends Thread {
Scanner sin = new Scanner(System.in);
@Override
public void run() {
while (sin.hasNextLine()) {
if(this.isInterrupted()) {
System.out.println("Thread is interrupted.. breaking from loop");
break;
}
String message = sin.nextLine();
System.out.println("Message us " + message);
// do processing...
}
}
public static void main(String args[]) throws InterruptedException {
DemoThread thread = new DemoThread();
thread.start();
Thread.sleep(5000);
thread.interrupt();
}
}
и выход
a
Message us a
s
Message us s
asd
Thread is interrupted.. breaking from loop
Поэтому, пожалуйста, проверьте еще раз. Также, если вы запутались с выходом asd, это строка ввода из предыдущей итерации цикла, в точке которой нить не прерывалась. Если вы не хотите, что вы можете сделать
if(!this.isInterrupted()) {
String message = sin.nextLine();
}
Why is this happening?
Допустим, в итерационном поток не прерывается, так что войти в то время цикла (hasNext() проходит из-за строки чтения в предыдущем итерация). Он проверяет, прерывается ли поток (скажем, это не в данный момент времени) и переходит к следующей строке (сканирование новой строки из stdinput). Теперь можно сказать, что поток прерывается. Ваша программа будет ждать, пока вы введете какую-нибудь строку (для которой вы должны нажать enter в консоли). Таким образом, даже если поток является inetrrupted, строка будет считана, и эта строка будет использоваться для оценки операции hasNext() (которая будет оцениваться как истина), и контекст войдет в цикл while. Вот увидит, что поток прерывается и прерывается.
Чтобы избежать этого, вам нужно прочитать строку внутри if (! This.isInterrupted()). Обратитесь к моему коду выше.
может быть, для этой ситуации делают, в то время как цикл будет иметь больше смысла. просто пропустите первую итерацию и как условие сделайте .. while (sin.hasNextLine() &&! this.isInterrupted()) –
Но это не решает проблему - поток по-прежнему заблокирован в вызове hasNextLine() ... – dmitru