public class TwoThreads {
private static Object resource = new Object();
private static void delay(long n) {
try
{
Thread.sleep(n);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.print("StartMain ");
new Thread1().start();
delay(1000); //dealay 1
Thread t2 = new Thread2();
t2.start();
delay(1000); // delay 2
t2.interrupt(); //step 7
delay(1000); //delay 3
System.out.print("EndMain ");
}
static class Thread1 extends Thread {
public void run() {
synchronized (resource) {
System.out.print("Startl ");
delay(6000);
System.out.print("End1 ");
}
}
}
static class Thread2 extends Thread {
public void run() {
synchronized (resource) {
System.out.print("Start2 ");
delay(2000);
System.out.print("End2 ");
}
}
}
}
ステップ 7 (マークしたとおり) で、メイン スレッドは thread を呼び出しますinterrupt()
がt2
、リソースのロックを取得するのを待っていたため、例外はスローされません。その後、メインスレッドはEnd Main
1000 ns 待ってから " " を出力します。つまり、メイン スレッドがタスクを完了したt2.interrupt()
後、例外がスローされるため、何が再びトリガーされるのでしょうか。