Pergunta

Eu tenho um código de log que precisa ser executado, afinal Threadss 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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top