Como iniciar dois threads em “exatamente” ao mesmo tempo

Os encadeamentos devem começar na mesma fração de segundo. Eu entendo, se você fizer thread1.start() , levará alguns milissegundos antes da próxima execução de thread2.start() .

É mesmo possível ou impossível?

Para iniciar os threads exatamente ao mesmo tempo (pelo menos o melhor possível), você pode usar um CyclicBarrier :

 // We want to start just 2 threads at the same time, but let's control that // timing from the main thread. That's why we have 3 "parties" instead of 2. final CyclicBarrier gate = new CyclicBarrier(3); Thread t1 = new Thread(){ public void run(){ gate.await(); //do stuff }}; Thread t2 = new Thread(){ public void run(){ gate.await(); //do stuff }}; t1.start(); t2.start(); // At this point, t1 and t2 are blocking on the gate. // Since we gave "3" as the argument, gate is not opened yet. // Now if we block on the gate from the main thread, it will open // and all threads will start to do stuff! gate.await(); System.out.println("all threads started"); 

Isso não tem que ser um CyclicBarrier , você também pode usar um CountDownLatch ou até mesmo um bloqueio.

Isso ainda não pode garantir que eles sejam iniciados exatamente ao mesmo tempo em JVMs padrão, mas você pode chegar muito perto disso. Chegar bem perto ainda é útil quando você faz, por exemplo, testes de desempenho. Por exemplo, se você estiver tentando medir a taxa de transferência de uma estrutura de dados com um número diferente de segmentos, use esse tipo de construção para obter o resultado mais preciso possível.

Em outras plataformas, os threads iniciais podem ser um requisito muito válido.

Não é possível, pelo menos em um único computador central. Mas por que você quer isso? Mesmo se você fosse capaz de iniciar dois threads exatamente no mesmo segundo, eles progredirão de maneira diferente porque o planejamento não está sob seu controle.

Edit: (Em resposta a alguns dos comentários) É um requisito perfeitamente válido para sincronizar o estado ou o progresso de vários segmentos e CyclicBarrier é uma ótima ferramenta. Eu respondi a pergunta se é possível iniciar vários threads exatamente ao mesmo tempo . CyclicBarrier garantirá que os encadeamentos continuem quando estiverem exatamente no estado desejado, mas não garante que eles serão iniciados ou retomados exatamente ao mesmo tempo, embora possa estar muito próximo. Não há menção às necessidades de synchronization na questão.

Você poderia usar um CountDownLatch para isso. Por favor, encontre abaixo uma amostra. Embora t1 e t2 sejam iniciados, esses segmentos continuam aguardando até que a linha principal conte a trava. O número de contagens necessárias é mencionado no construtor. A trava da contagem regressiva também pode ser usada para aguardar que os encadeamentos terminem a execução para que o encadeamento principal possa continuar (o caso inverso). Esta class foi incluída desde o Java 1.5.

 import java.util.concurrent.CountDownLatch; public class ThreadExample { public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(1); MyThread t1 = new MyThread(latch); MyThread t2 = new MyThread(latch); new Thread(t1).start(); new Thread(t2).start(); //Do whatever you want latch.countDown(); //This will inform all the threads to start //Continue to do whatever } } class MyThread implements Runnable { CountDownLatch latch; public MyThread(CountDownLatch latch) { this.latch = latch; } @Override public void run() { try { latch.await(); //The thread keeps waiting till it is informed } catch (InterruptedException e) { e.printStackTrace(); } //Do the actual thing } } 
  1. Pelo que entendi, a JVM principalmente delega essas coisas para o sistema operacional. Portanto, a resposta será específica do sistema operacional.
  2. É claramente impossível em máquinas de processador único.
  3. É mais complicado em relação a uma máquina com vários processadores. De acordo com a Relatividade da simultaneidade , “é impossível dizer em um sentido absoluto se dois events ocorrem ao mesmo tempo se esses events estão separados no espaço”. Não importa quão perto seus processadores estejam, eles estão separados no espaço.
    1. Se você pode aceitar a simultaneidade relativa, então é provavelmente mais fácil simulá-la usando técnicas discutidas em outras respostas.