実行順序を予測できるように、以下のコードがデバッガーで実行されると仮定します。
- t1-ここで、task1はいくつかの長いタスクの作業を開始します。
- t2 --- task1がロックを保持しているため、task2は@Syncronizedステートメントでブロックされます。
- t3 --task2は中断されますが、task2が組み込みロックを使用しているため、@同期して中断できないために失敗しました。(Renenterant.lockInterruptible()はInterruptedExecptionをスローします)。
- t4---task1が中断されます。ただし、try catchブロックで複雑なタスクを実行したにもかかわらず、InterruptedExecptionがスローされることはありませんでした。何故ですか ?
コード:
public class TestInteruptibility {
public static Object lock = new Object();
public static boolean spin = true;
public static void main(String[] args) {
Thread task1 = new Thread(new Task(), "Task1");
Thread task2 = new Thread(new Task(), "Task2");
Thread notifier1 = new Thread(new Notifier(), "Notifier1");
task1.start();
task2.start();
task2.interrupt();
task1.interrupt();
notifier1.start();
}
}
class Task implements Runnable {
public void run() {
synchronized (TestInteruptibility.lock) {
System.out.println("Performing Long Task");
try {
while (TestInteruptibility.spin) {
}
System.out.println("Finsihed Performing Long Task");
TestInteruptibility.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("I got interrupted while i was waiting @ wait()");
}
System.out.println("Ending Task");
}
}
}
class Notifier implements Runnable {
public void run() {
synchronized (TestInteruptibility.lock) {
System.out.println("Performing notification");
TestInteruptibility.lock.notify();
System.out.println("Ending notification");
}
}
}