Ответ 1
interrupt()
прерывает поток, который вы прервали, а не поток, выполняющий прерывание.
c.f.
Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException
В принципе, что говорит заголовок вопроса.
Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?
Из моих собственных тестов, похоже, просто хотелось быть уверенным. Я предполагаю, что Thread.join()
проверяет статус interrupted
потока перед выполнением его "ожидания"?
interrupt()
прерывает поток, который вы прервали, а не поток, выполняющий прерывание.
c.f.
Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException
Выполняет ли вызов Thread.interrupt() перед Thread.join(), заставляя join() немедленно вызывать InterruptedException?
Нет, он не бросит. Только если текущий поток, вызывающий метод join()
, прервется, будет join()
throw InterruptedException
. t.interrupt()
прерывает только что запущенный поток, а t.join()
будет только бросать InterruptedException
, если сам поток, который выполняет соединение (возможно, основной поток?), сам прерван.
Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); // will _not_ throw unless this thread calling join gets interrupted
Также важно понимать, что прерывание потока не отменяет его, а join()
не похоже на Future
, поскольку оно вернет исключение, которое вызвал поток.
Когда вы прерываете поток, любые вызовы, которые поток создает в sleep()
, wait()
, join()
, а другие прерываемые методы будут бросать InterruptedException
. Если эти методы не вызывают, поток будет продолжать работать. Если поток выдает InterruptedException
в ответ на прерывание и затем завершает работу, это исключение будет потеряно, если вы не использовали t.setDefaultUncaughtExceptionHandler(handler)
.
В вашем случае, если поток прерывается и заканчивается, потому что он возвращается, то соединение завершается - он не будет генерировать исключение. Общий код потока для правильной обработки прерывания выглядит следующим образом:
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// a good pattern is to re-interrupt the thread when you catch
Thread.currentThread().interrupt();
// another good pattern is to make sure that if you _are_ interrupted,
// that you stop the thread
return;
}
}