Вызывает ли вызов Thread.interrupt() перед Thread.join(), потому что join() немедленно вызывает InterruptedException?

В принципе, что говорит заголовок вопроса.

Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?

Из моих собственных тестов, похоже, просто хотелось быть уверенным. Я предполагаю, что Thread.join() проверяет статус interrupted потока перед выполнением его "ожидания"?

Ответ 1

interrupt() прерывает поток, который вы прервали, а не поток, выполняющий прерывание.

c.f.

Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException 

Ответ 2

Выполняет ли вызов 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;
    }
 }