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
t1e t2. Os dois threads começam a ser executados em paralelo.
- O encadeamento principal pede
t1.join()para aguardar o t1encadeamento.
- O
t1encadeamento é concluído e o t1.join()método retorna no encadeamento principal. Observe que t1já 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 t2encadeamento.
- O
t2encadeamento é concluído (ou pode ter sido concluído antes do t1encadeamento) e o t2.join()método retorna no encadeamento principal.
É importante entender que os threads t1e t2estã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, t1e / ou t2poderia 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 t1término do thread. O t2encadeamento está sendo executado em paralelo e não é afetado t1nem pela t1.join()chamada.
Em termos de tentativa / captura, os join()arremessos InterruptedExceptionsignificam que o thread principal que está chamando join()pode ser interrompido por outro thread.
while (true) {
Ter as junções em whileloop é um padrão estranho. Normalmente, você faria a primeira junção e, em seguida, a segunda junção, manipulando InterruptedExceptionadequadamente em cada caso. Não há necessidade de colocá-los em um loop.