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() безопасен?
Или лучше оставить всё как есть?


Ответы (0 шт):