Cómo iniciar dos hilos en “exactamente” el mismo tiempo

Los hilos deberían comenzar en la misma fracción de segundo. Entiendo, si haces thread1.start() , tomará algunos milisegundos antes de la próxima ejecución de thread2.start() .

¿Es posible o imposible?

Para iniciar los hilos exactamente al mismo tiempo (al menos lo mejor posible), puede utilizar un 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"); 

Esto no tiene por qué ser un CyclicBarrier , también podría usar un CountDownLatch o incluso un candado.

Todavía no se puede asegurar de que se inicien exactamente al mismo tiempo en JVM estándar, pero puede acercarse bastante. Acercarse bastante todavía es útil cuando haces, por ejemplo, pruebas de rendimiento. Por ejemplo, si está tratando de medir el rendimiento de una estructura de datos con diferente cantidad de hilos que la golpean, quiere usar este tipo de construcción para obtener el resultado más preciso posible.

En otras plataformas, comenzar hilos exactamente puede ser un requisito muy válido por cierto.

No es posible, al menos en una computadora central. Pero, ¿por qué quieres eso? Incluso si pudieras iniciar dos hilos exactamente en el mismo segundo, progresarán de forma diferente porque la progtwigción no está bajo tu control.

Editar: (En respuesta a algunos de los comentarios) Es un requisito perfectamente válido para sincronizar el estado o el progreso de múltiples hilos y CyclicBarrier es una gran herramienta. Respondí la pregunta si es posible iniciar varios hilos exactamente al mismo tiempo . CyclicBarrier garantizará que los subprocesos continúen cuando estén exactamente en el estado deseado, pero no garantiza que comiencen o reanuden al mismo tiempo, aunque podría ser bastante cercano. No hay mención de las necesidades de sincronización en la pregunta.

Puede usar un CountDownLatch para esto. Por favor encuentre abajo una muestra. Aunque se inician t1 y t2, estos subprocesos siguen esperando hasta que el hilo principal cuente hacia abajo el pestillo. La cantidad de cuentas regresivas requeridas se menciona en el constructor. El locking de cuenta regresiva también se puede usar para esperar a que los hilos terminen la ejecución, de modo que el hilo principal pueda avanzar más (en el caso inverso). Esta clase se incluyó desde 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. Según tengo entendido, la JVM principalmente delega estas cosas en el sistema operativo. Entonces la respuesta será específica del sistema operativo.
  2. Es claramente imposible en máquinas de un solo procesador.
  3. Es más complicado con respecto a una máquina multiprocesador. De acuerdo con la Relatividad de la simultaneidad , “es imposible decir en un sentido absoluto si dos eventos ocurren al mismo tiempo si esos eventos están separados en el espacio”. No importa cuán cerca estén sus procesadores, están separados en el espacio.
    1. Si puede aceptar la simultaneidad relativa, entonces probablemente sea más fácil simplemente simularla usando técnicas discutidas en otras respuestas.