私のテストはあなたの調査結果を裏付けていないようです。期待どおりに動作しています!
次のデモコードを書きました
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?
反復でスレッドが中断されていないため、while ループに入ります (前の反復で読み取られた文字列のため、hasNext() が通過します)。次の行へ (stdinput から新しい文字列をスキャンします)。ここで、スレッドが中断されたとしましょう。プログラムは、文字列を入力するまで待機します(コンソールでEnterキーを押す必要があります)。したがって、スレッドが中断されていない場合でも、文字列が読み取られ、この文字列が hasNext() 操作 (true と評価される) を評価するために使用され、コンテキストが while ループに入ります。
これを回避するには、if(!this.isInterrupted()) ステートメント内の文字列を読み取る必要があります。上記のコードを参照してください。