Os tópicos devem começar na mesma fração de segundo. Eu entendo, se você fizer thread1.start()
isso, vai demorar alguns milissegundos antes da próxima execução dethread2.start()
.
É mesmo possível ou impossível?
java
multithreading
figaro
fonte
fonte
Respostas:
Para iniciar os threads exatamente ao mesmo tempo (pelo menos da melhor forma possível), você pode usar um CyclicBarrier :
Não precisa ser um
CyclicBarrier
, você também pode usar umCountDownLatch
ou até mesmo um cadeado.Isso ainda não pode garantir que eles sejam iniciados exatamente ao mesmo tempo em JVMs padrão, mas você pode chegar bem perto. Chegar bem perto ainda é útil quando você faz, por exemplo, testes de desempenho. Por exemplo, se você está tentando medir o rendimento de uma estrutura de dados com um número diferente de threads atingindo-a, você deseja usar esse tipo de construção para obter o resultado mais preciso possível.
Em outras plataformas, iniciar threads exatamente pode ser um requisito muito válido btw.
fonte
CreateEvent
. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspxNão é possível, pelo menos em um computador de núcleo único. Mas por que você quer isso? Mesmo se você pudesse iniciar dois threads exatamente no mesmo segundo, eles progrediriam de forma diferente porque o agendamento não está sob seu controle.
Editar: (em resposta a alguns dos comentários) É um requisito perfeitamente válido sincronizar o estado ou o progresso de vários threads e
CyclicBarrier
é uma ótima ferramenta. Eu respondi à pergunta se é possível iniciar vários threads exatamente ao mesmo tempo .CyclicBarrier
irá garantir que os threads continuem quando estiverem exatamente no estado desejado, mas não garante que eles serão iniciados ou retomados exatamente ao mesmo tempo, embora possa ser bem próximo. Não há menção das necessidades de sincronização na pergunta.fonte
Você pode usar um CountDownLatch para isso. Veja abaixo um exemplo. Embora t1 e t2 sejam iniciados, esses encadeamentos continuam esperando até que o encadeamento principal faça a contagem regressiva da trava. O número de contagens regressivas necessárias é mencionado no construtor. A trava de contagem regressiva também pode ser usada para esperar que os encadeamentos concluam a execução para que o encadeamento principal possa prosseguir (o caso inverso). Esta classe foi incluída desde Java 1.5.
fonte
fonte