Java безопасно ли вызывать метод join() потока после завершения его работы, когда поток перешел в состояние TERMINATED?
В коде клиента есть тред, вся цель которого - перезапуск другого треда, для подключения к серверу, в случае если он еще не запущен или произошел обрыв связи. Код предельно простой:
@Override
public void run() {
while (!isInterrupted()) {
InputThread inp = new InputThread(port, addr);
inp.start();
try {
inp.join();
try {
sleep(TIME_WAIT_SERVER);
} catch (InterruptedException e) {
break;
}
// поток был завершен, возможно отсутствует сервер, или связь прервалась
// просто перезапустим его
} catch (InterruptedException e) {
inp.interrupt();
try {
inp.join();
} catch (InterruptedException ignored) {
}
break;
}
}
}
Все работает, все треды нормально отрабатывают и закрываются по закрытию программы.
Но возник вопрос, а нужна ли конструкция try .. catch
вокруг sleep(TIME_WAIT_SERVER)
? Если ее убрать, то при вызове извне метода interrupt()
sleep
прерывается и управление попадает во внешний InterruptedException
.
Смущает только одно - там вызывается inp.join()
, который к тому времени уже остановлен.
Собственно вопрос:
Я правильно понимаю, что раз ссылка на inp
еще существует, то тред по идее пока еще в памяти и вызов inp.join()
безопасен?
Или лучше оставить всё как есть?