Como executar um pedaço de código somente depois que todos os threads são feitos
-
18-09-2019 - |
Pergunta
Eu tenho um código de log que precisa ser executado, afinal Threads
s são executados.
Thread t1 = new MyThread();
Thread t2 = new MyThread();
t1.run();
t2.run();
doLogging();
Existe alguma maneira de executar doLogging()
Somente depois que ambos os threads são feitos com seu processamento. Agora isso doLogging()
é chamado assim que T1 e T2 são iniciados.
Solução
Apenas join()
todos os tópicos antes do seu doLogging()
ligar:
t1.join();
t2.join();
// the following line will be executed when both threads are done
doLogging();
Observe que a ordem de join()
As chamadas não importam se você deseja esperar por todos os seus tópicos.
Outras dicas
Além da solução de junção (), também há algo chamado CountdownLatch na biblioteca java.util.Concurrent. Ele permite inicializá -lo em um determinado número e, em seguida, aguarde até que fosse atingido o número especificado de vezes.
Exemplo simples:
CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS);
for(int i=0; i<NUMBER_OF_THREADS;i++)
new Thread(myCode).start();
latch.await();
A trava deve ser explicitamente atingida pelos fios do trabalhador para que isso funcione:
latch.countDown()
Se você estiver executando o código do encadeamento principal, lembre -se de que ele fará com que a interface do usuário pendure até que os dois threads concluam. Este pode não ser o efeito desejado.
Em vez disso, você pode considerar uma construção onde cada fio sincroniza sobre o seu Logger
Objeta e execute chamadas nesse construto. Como não sei o que você está tentando especificar, a outra solução é o que Joachim sugerido, apenas colocando esse código dentro de um encadeamento.