Подтвердить что ты не робот

Каково поведение Thread.join() в Java, если цель еще не запущена?

В многопоточной java-программе, что произойдет, если объект потока T был создан, а затем вызвал T.join() до начала потока? Предположим, что какой-то другой поток мог вызвать T.start() в любое время после того, как T был создан, либо до, либо после того, как другой поток вызывает T.join().

Я спрашиваю, потому что я думаю, что у меня есть проблема, когда T.join() был вызван до T.start(), и поток, вызывающий T.join(), зависает.

Да, я знаю, что у меня есть некоторые проблемы с дизайном, которые, если они исправлены, могут сделать это не вопросом. Тем не менее, я хотел бы знать специфику поведения join(), поскольку единственное, что говорит Java API, - "Ожидает, что этот поток умрет".

4b9b3361

Ответ 1

Он просто вернется. См. Код ниже - isAlive() будет ложным до начала потока, поэтому ничего не произойдет.

   public final synchronized void join(long millis) 
    throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;

    if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
        wait(0);
        }
    } else {
        while (isAlive()) {
        long delay = millis - now;
        if (delay <= 0) {
            break;
        }
        wait(delay);
        now = System.currentTimeMillis() - base;
        }
    }
    }

Фрагмент кода: © Copyright Oracle 2006 и/или его ветки, и может быть найден здесь. Лицензия на Лицензия Java Research.

Ответ 2

Он должен ждать бесконечно, чтобы поток завершился... что в вашем случае никогда не происходит, насколько я понимаю.