Що означає цей код приєднання потоку?
Цитувати з Thread.join()методу javadocs :
join() Чекає, коли ця нитка загине.
Є потік, на якому працює ваш приклад, який, мабуть, є основним потоком .
- Основна нитка створює і запускає
t1і t2потоки. Дві нитки починають працювати паралельно.
- Основний потік закликає
t1.join()чекати, коли t1нитка закінчиться.
- На
t1нитки завершується , і t1.join()метод повертає в головному потоці. Зверніть увагу, що t1це вже могло закінчитися до join()виклику, і в цьому випадку join()виклик негайно повернеться.
- Основний потік закликає
t2.join()чекати, коли t2нитка закінчиться.
- У
t2завершує нитка (або це може бути завершено до того , як t1нитка зробила) і t2.join()повертає метод в основному потоці.
Важливо розуміти, що t1і t2потоки працюють паралельно, але головна нитка, яка їх запустила, повинна зачекати, поки вони закінчуються, перш ніж вона може продовжуватися. Це загальна закономірність. Також t1та / або t2могли завершитися, перш ніж основний потік викликає join()їх. Якщо так, то join()не чекатиме, але повернеться негайно.
t1.join() означає спричинити зупинку t2, поки t1 не припиняється?
Ні. Основна нитка, яка викликає t1.join(), перестане працювати і чекатиме завершення t1потоку. t2Нитка працює паралельно і не впливає t1або t1.join()виклик на всіх.
З точки зору спроби / лову, join()кидки InterruptedExceptionозначають, що головна нитка, яка викликає, join()сама по собі може бути перервана іншим потоком.
while (true) {
Наявність з'єднань у whileциклі - дивна закономірність. Зазвичай ви робите перше з'єднання, а потім друге з'єднання, обробляючи InterruptedExceptionналежним чином у кожному конкретному випадку. Не потрібно їх класти в петлю.