Разница между wait (long timeout) и join (long millis)? - PullRequest
5 голосов
/ 11 января 2012

Оба метода wait () и join () при вызове thread-1 в thread-2 заставляют thread-1 ожидать thread-2 либо некоторое время, либо до завершения thread-2.

Если мы используем перегруженные версии этих методов, то есть wait (long timeout) и join (long millis), тогда

  1. В случае wait (long timeout), thread-1 станетзапускается либо по уведомлению (или по уведомлению), либо даже по таймауту (в зависимости от того, что наступит раньше).

  2. В случае объединения (длинный миллис) поток-2 станет работоспособным либо при потоке-2завершается или происходит тайм-аут (в зависимости от того, что наступит раньше).

Так в чем же разница между этими двумя реализациями?

Некоторые из них, которые я думал, это:

  1. Для wait () нам нужно заблокировать объект, на котором мы ожидаем.Для join () это не обязательно.
  2. После выполнения wait () поток удаляет полученную блокировку и повторно получает блокировку, как только он снова начинает работать.Но как насчет присоединиться?Удаляет ли поток блокировку после выполнения объединения, если оно было выполнено из синхронизированного блока (или метода)?

1 Ответ

6 голосов
/ 11 января 2012

Как вы говорите, процесс "релиза" совершенно другой - в том случае, если он основан на notify(), другой - на завершении потока. Это совершенно разные звонки, которые служат совершенно другим целям.

На самом деле, существуют явные предупреждения , а не для вызова wait() на Thread мониторах (хотя я не могу сразу найти эти предупреждения), поскольку внутренний код Java получает блокировки для них (и использует wait / notify)

Но нет, вызов join() на Thread не освобождает монитор, если текущий выполняющийся поток владеет им.

По сути, вы вообще не должны думать о них как о похожих - нужно ждать окончания потока; другой - для ожидания совместной координации.

...