В этом коде, что означают два соединения и разрыв? t1.join()
вызывает, t2
чтобы остановить, пока не t1
закончится?
Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread t2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
try {
t1.join();
t2.join();
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
java
multithreading
user697911
источник
источник
while(true)
вызыватьjoin
метод.Ответы:
Цитировать из
Thread.join()
метода Javadocs :Существует поток, который выполняет ваш пример кода, который, вероятно, является основным потоком .
t1
иt2
тему. Два потока начинают работать параллельно.t1.join()
ожидание завершенияt1
потока.t1
завершается, иt1.join()
метод возвращается в основной поток. Обратите внимание, чтоt1
он уже мог закончиться доjoin()
того, как будет выполнен вызов, и в этом случаеjoin()
вызов будет немедленно возвращен.t2.join()
ожидание завершенияt2
потока.t2
завершается (или мог завершиться раньше, чемt1
поток), иt2.join()
метод возвращается в основной поток.Важно понимать, что потоки
t1
andt2
работали параллельно, но основному потоку, который их запустил, нужно дождаться их завершения, прежде чем он сможет продолжить. Это обычная модель. Кроме того,t1
и / илиt2
мог завершиться до того, как основной поток вызоветjoin()
их. Если это так, тоjoin()
не будет ждать, но вернется немедленно.Нет. Основной вызывающий поток
t1.join()
прекратит работу и будет ждатьt1
его завершения. Потокt2
работает параллельно и не подвержен влияниюt1
илиt1.join()
вызову вообще.С точки зрения try / catch,
join()
throwsInterruptedException
означает, что основной поток, который вызывает,join()
может сам быть прерван другим потоком.Наличие соединений в
while
цикле - странная картина. Как правило, вы выполняете первое соединение, а затем второе соединение, обрабатываяInterruptedException
соответственно в каждом случае. Не нужно их зацикливать.источник
t1
иt2
может работать параллельно. Просто имmain
нужно, чтобы они оба закончили, прежде чем продолжить. Это типичный шаблон @ user697911.while
Петля там , потому что (я думаю) он хочет повторить теjoin()
вызовы , если один прерывается? Я бы точно так не написал @ user697911.t1
и другоеt2
закончилось. То есть. еслиt1
выкинетInterruptedException
, он вернется и будет ждатьt2
. Альтернативой является ожидание обоих потоков в каждом их Try-Catch, чтобы избежать цикла. Кроме того, в зависимости отEventThread
этого может иметь смысл сделать это таким образом, так как мы запускаем 2 потока, а не один.Это любимый вопрос интервью на Java .
t1.join()
означает, что t1 говорит что-то вроде « Я хочу закончить первым ». То же самое в случае сt2
. Независимо от того, кто началt1
или вt2
каком потоке (в данном случае этоmain
метод), main будет ждать, покаt1
и неt2
завершит свою задачу.Тем не менее, важно отметить,
t1
иt2
сами могут работать параллельно, независимо от последовательности вызовов соединения наt1
иt2
. Этоmain/daemon
нить, которая должна ждать .источник
t1.join(); t2.join();
не позволит потоку, который выполняет соединения, продолжаться, пока оба потока не завершатся. При отсутствии очень необычного кода в другом месте порядок соединений не имеет значения.join()
означает ожидание завершения потока. Это метод блокирования. Ваш основной поток (тот, который выполняетjoin()
) будет ждать наt1.join()
линии, пока не завершитt1
свою работу, а затем будет делать то же самое дляt2.join()
.источник
Одна картинка стоит тысячи слов.
Надеюсь на полезное, для более подробной информации нажмите здесь
источник
Когда поток tA вызывает tB.join (), его причины не только ждут смерти tB или самого прерывания tA, но и создают случайное отношение между последним оператором в tB и следующим оператором после tB.join () в потоке tA.
Значит программа
Всегда печатать
Но программа
Можно печатать не только
Но
Всегда только «0».
Поскольку Java Memory Model не требует «передачи» нового значения sharedVar из threadB в основной поток без отношения heppens-before (начало потока, объединение потока, использование ключевого слова synchronized, использование переменных AtomicXXX и т. Д.).
источник
Проще говоря:
t1.join()
возвращается послеt1
завершения.Он ничего не делает с потоком
t1
, кроме как дождаться его завершения.Естественно, следующий код
t1.join()
будет выполняться только послеt1.join()
возврата.источник
Со страницы документации оракула в Joins
Если t1 является
Thread
объектом, поток которого выполняется в данный момент,Если t2 является
Thread
объектом, поток которого выполняется в данный момент,join
API - это API низкого уровня, который был представлен в более ранних версиях Java. Многие вещи были изменены в течение определенного периода времени (особенно с выпуском jdk 1.5) на фронте параллелизма.Вы можете достичь того же с помощью API java.util.concurrent. Некоторые из примеров
ExecutorService
Executors
(начиная с Java 8)Обратитесь к связанным вопросам SE:
ждать, пока все потоки не закончат свою работу в Java
источник
Для меня поведение Join () всегда сбивало с толку, потому что я пытался вспомнить, кто кого будет ждать. Не пытайтесь запомнить это таким образом.
Все мы знаем, что когда мы вызываем wait () для любого объекта (t1), вызывающий объект (main) отправляется в комнату ожидания (состояние Blocked).
Здесь основной поток вызывает join (), который wait () под прикрытием. Таким образом, основной поток будет ждать, пока не получит уведомление. Уведомление дается t1, когда он заканчивает свою работу (завершение потока).
После получения уведомления главный выходит из комнаты ожидания и приступает к его исполнению.
источник
Надеюсь, поможет!
источник
скажем, наш основной поток запускает потоки t1 и t2. Теперь, когда вызывается t1.join (), основной поток приостанавливает себя до тех пор, пока поток t1 не умирает, а затем возобновляет себя. Точно так же, когда t2.join () выполняется, основной поток снова приостанавливает себя, пока поток t2 не умирает, а затем возобновляет работу.
Итак, вот как это работает.
Кроме того, цикл while здесь не нужен.
источник