Делает вызывающий поток.прерывание () перед потоком.join() заставить join () немедленно вызвать исключение InterruptedException?

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

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

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

2 ответов


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

Си.Ф.

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

делает вызывающий поток.прерывание () перед потоком.join() заставить join () немедленно вызвать исключение InterruptedException?

нет, он не бросит. Только если настоящее поток, который называет join() метод прерывается будет join() бросить 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;
    }
 }