Що означає цей код приєднання потоку?
Цитувати з 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
належним чином у кожному конкретному випадку. Не потрібно їх класти в петлю.