Arasn:
どのように第二のループは、実際には最初にしません眠ってメインスレッドを中断し、?? 私の理解ではのThread.sleep(3000)、コードにThread.currentThread()の後である。割り込み()3秒後に実行されます。それが実際にどのように動作するか、誰が説明することができます
for (int i = 0; i < 2; i++) {
try {
System.out.println("loop : " + i);
Thread.sleep(3000);
System.out.println("Woke up");
Thread.currentThread().interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
loop : 0
Woke up
loop : 1
java.lang.InterruptedException: sleep interrupted
exception loop:1
at java.base/java.lang.Thread.sleep(Native Method)
at multithreadings.Mainclass.main(Mainclass.java:13)
アンディ・ターナー:
中断が停止する丁寧な要求である:スレッドが停止する義務を負いません。
それはおよそロビン・ウィリアムズの冗談のようなものだあなたは罪を犯したときに言って、英国内のどの警察:
やめる!または私は再びストップを言いますよ!
また、スレッドを中断することはありませんInterruptedException
スローされる:それは単にスレッドにフラグを設定します。何か(のような場合にThread.sleep
チェック)このフラグ、およびそれが設定されていることを発見、それはその後、スローすることがありますInterruptedException
。しかしフラグと例外は、割り込みを示すの直交する2つの方法があります。
など:
- 最初の実行では、あなたは3秒間スリープし、その後、中断したフラグを設定し、ループ本体が正常に終了します。
- 第二の実行では、あなたは3秒間スリープ状態に頼むが、
Thread.sleep
中断されたフラグを検出し、例外がスローされます。