O que esse código de associação de encadeamento significa?
Para citar o Thread.join()
método javadocs :
join()
Aguarda que este segmento morra.
Há um encadeamento que está executando seu código de exemplo que provavelmente é o encadeamento principal .
- O thread principal cria e inicia os threads
t1
e t2
. Os dois threads começam a ser executados em paralelo.
- O encadeamento principal pede
t1.join()
para aguardar o t1
encadeamento.
- O
t1
encadeamento é concluído e o t1.join()
método retorna no encadeamento principal. Observe que t1
já poderia ter terminado antes que a join()
chamada seja feita . Nesse caso, a join()
chamada retornará imediatamente.
- O encadeamento principal pede
t2.join()
para aguardar o t2
encadeamento.
- O
t2
encadeamento é concluído (ou pode ter sido concluído antes do t1
encadeamento) e o t2.join()
método retorna no encadeamento principal.
É importante entender que os threads t1
e t2
estão sendo executados em paralelo, mas o thread principal que os iniciou precisa aguardar o término antes de continuar. Esse é um padrão comum. Além disso, t1
e / ou t2
poderia ter terminado antes que o thread principal os chamasse join()
. Nesse caso, join()
não esperará, mas retornará imediatamente.
t1.join()
significa fazer com que t2 pare até que t1 termine?
Não. O thread principal que está chamando t1.join()
irá parar de executar e aguardará o t1
término do thread. O t2
encadeamento está sendo executado em paralelo e não é afetado t1
nem pela t1.join()
chamada.
Em termos de tentativa / captura, os join()
arremessos InterruptedException
significam que o thread principal que está chamando join()
pode ser interrompido por outro thread.
while (true) {
Ter as junções em while
loop é um padrão estranho. Normalmente, você faria a primeira junção e, em seguida, a segunda junção, manipulando InterruptedException
adequadamente em cada caso. Não há necessidade de colocá-los em um loop.