Nesse código, o que as duas junções e quebra significam? t1.join()
faz t2
parar até t1
terminar?
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
fonte
fonte
while(true)
chamar ojoin
método.Respostas:
Para citar o
Thread.join()
método javadocs :Há um encadeamento que está executando seu código de exemplo que provavelmente é o encadeamento principal .
t1
et2
. Os dois threads começam a ser executados em paralelo.t1.join()
para aguardar ot1
encadeamento.t1
encadeamento é concluído e ot1.join()
método retorna no encadeamento principal. Observe quet1
já poderia ter terminado antes que ajoin()
chamada seja feita . Nesse caso, ajoin()
chamada retornará imediatamente.t2.join()
para aguardar ot2
encadeamento.t2
encadeamento é concluído (ou pode ter sido concluído antes dot1
encadeamento) e ot2.join()
método retorna no encadeamento principal.É importante entender que os threads
t1
et2
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 / out2
poderia ter terminado antes que o thread principal os chamassejoin()
. Nesse caso,join()
não esperará, mas retornará imediatamente.Não. O thread principal que está chamando
t1.join()
irá parar de executar e aguardará ot1
término do thread. Ot2
encadeamento está sendo executado em paralelo e não é afetadot1
nem pelat1.join()
chamada.Em termos de tentativa / captura, os
join()
arremessosInterruptedException
significam que o thread principal que está chamandojoin()
pode ser interrompido por outro thread.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, manipulandoInterruptedException
adequadamente em cada caso. Não há necessidade de colocá-los em um loop.fonte
t1
et2
pode ser executado em paralelo. É só quemain
eles precisam terminar antes de continuar. Esse é um padrão típico @ user697911.while
loop existe porque (eu acho) ele quer tentar novamente asjoin()
chamadas se uma for interrompida? Eu certamente não escreveria dessa maneira @ user697911.t1
et2
terminar. Ou seja. set1
joga oInterruptedException
, ele volta e esperat2
. Uma alternativa é esperar pelos dois threads em cada Try-Catch, para que o loop possa ser evitado. Além disso, dependendo disso,EventThread
pode fazer sentido fazer dessa maneira, pois estamos executando 2 threads, não um.Esta é uma pergunta favorita da entrevista sobre Java .
t1.join()
significa, t1 diz algo como " Eu quero terminar primeiro ". Mesmo é o caso comt2
. Independentemente de quem iniciout1
out2
encadeava (neste caso, omain
método), o main aguardarát1
et2
concluirá sua tarefa.No entanto, um ponto importante a ser anotado
t1
et2
eles mesmos podem ser executados em paralelo, independentemente da sequência de chamada de junção emt1
et2
. É omain/daemon
fio que tem que esperar .fonte
t1.join(); t2.join();
não permitirá que o thread que executa as junções continue até que ambos os threads sejam finalizados. Na ausência de código muito incomum em outro lugar, a ordem das junções não importa.join()
significa aguardar a conclusão de um encadeamento. Este é um método bloqueador. Seu encadeamento principal (aquele que faz ojoin()
) aguardará nat1.join()
linha atét1
concluir seu trabalho e, em seguida, fará o mesmot2.join()
.fonte
Uma imagem vale mais que mil palavras.
Espero útil, para mais detalhes clique aqui
fonte
Quando o encadeamento tA chama tB.join (), suas causas não apenas esperam que o tB morra ou o tA seja interrompido, mas criam uma relação de ocorrência anterior entre a última instrução em tB e a próxima instrução após tB.join () no segmento tA.
Significa programa
Sempre imprima
Mas programa
Pode imprimir não apenas
Mas
Sempre apenas '0'.
Como o Java Memory Model não exige 'transferência' do novo valor de 'sharedVar' do threadB para o thread principal sem relação heppens-before (início do thread, associação do thread, uso da palavra-chave 'synchonized', uso de variáveis AtomicXXX, etc.).
fonte
Simplificando:
t1.join()
retorna após at1
conclusão.Ele não faz nada para encadear
t1
, exceto esperar que termine.Naturalmente, o código a seguir
t1.join()
será executado somente apóst1.join()
retornos.fonte
Da página de documentação do oracle em Junções
Se t1 for um
Thread
objeto cuja thread está em execução no momento,Se t2 for um
Thread
objeto cuja thread está em execução no momento,join
API é uma API de baixo nível, que foi introduzida em versões anteriores do java. Muitas coisas foram alteradas ao longo de um período de tempo (especialmente com o lançamento do jdk 1.5) na frente da concorrência.Você pode conseguir o mesmo com a API java.util.concurrent. Alguns dos exemplos são
ExecutorService
Executors
(desde java 8)Consulte as perguntas relacionadas ao SE:
aguarde até que todos os threads concluam seu trabalho em java
fonte
Para mim, o comportamento do Join () sempre foi confuso, porque eu estava tentando lembrar quem esperaria por quem. Não tente se lembrar dessa maneira.
Todos sabemos que, quando chamamos wait () em qualquer objeto (t1), o objeto de chamada (main) é enviado para a sala de espera (estado bloqueado).
Aqui, o thread principal está chamando join () que é wait () sob as cobertas. Portanto, o thread principal aguardará até que seja notificado. A notificação é dada por t1 quando termina sua execução (conclusão do encadeamento).
Após receber a notificação, o main sai da sala de espera e continua sua execução.
fonte
Espero que ajude!
fonte
digamos que nosso thread principal inicie os threads t1 e t2. Agora, quando t1.join () é chamado, o encadeamento principal se suspende até o encadeamento t1 morrer e, em seguida, recomeça. Da mesma forma, quando t2.join () é executado, o encadeamento principal se suspende novamente até o encadeamento t2 morrer e, em seguida, retomar.
Então é assim que funciona.
Além disso, o loop while não era realmente necessário aqui.
fonte