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 (как я уже отметил) основной поток вызывает interrupt()
в потоке t2
, но поскольку он ожидал получения блокировки ресурса, он не выдает никаких исключений. После этого основной поток выводит «End Main
» после ожидания 1000 нс. Другими словами, основной поток завершил свою задачу, так что же снова вызывает t2.interrupt()
, потому что после этого он выдает исключение?