Los hilos deben comenzar en la misma fracción de segundo. Entiendo, si lo hace thread1.start()
, pasarán algunos milisegundos antes de la próxima ejecución de thread2.start()
.
¿Es posible o imposible?
Los hilos deben comenzar en la misma fracción de segundo. Entiendo, si lo hace thread1.start()
, pasarán algunos milisegundos antes de la próxima ejecución de thread2.start()
.
¿Es posible o imposible?
Respuestas:
Para iniciar los subprocesos exactamente al mismo tiempo (al menos lo mejor posible), puede usar 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 que ser un CyclicBarrier
, también puede usar CountDownLatch
un candado o incluso un candado.
Esto todavía no puede garantizar que se inicien exactamente al mismo tiempo en las JVM estándar, pero puede acercarse bastante. Acercarse bastante sigue siendo útil cuando haces, por ejemplo, pruebas de rendimiento. Por ejemplo, si está tratando de medir el rendimiento de una estructura de datos con un número diferente de subprocesos, desea utilizar este tipo de construcción para obtener el resultado más preciso posible.
En otras plataformas, iniciar subprocesos exactamente puede ser un requisito muy válido por cierto.
CreateEvent
. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
No es posible, al menos en una computadora de un solo núcleo. Pero, ¿por qué quieres eso? Incluso si pudo iniciar dos subprocesos exactamente en el mismo segundo, progresarán de manera diferente porque la programación no está bajo su control.
Editar: (En respuesta a algunos de los comentarios) Es un requisito perfectamente válido sincronizar el estado o progreso de múltiples hilos y CyclicBarrier
es una gran herramienta. Respondí a la pregunta de si es posible iniciar varios subprocesos exactamente al mismo tiempo . CyclicBarrier
garantizará que los subprocesos continúen cuando estén exactamente en el estado deseado, pero no garantiza que se iniciarán o reanudarán exactamente al mismo tiempo, aunque podría estar bastante cerca. No se mencionan las necesidades de sincronización en la pregunta.
Podrías usar un CountDownLatch para esto. A continuación encontrará una muestra. Aunque t1 y t2 se inician, estos subprocesos siguen esperando hasta que el subproceso principal cuenta hacia atrás el pestillo. El número de cuentas atrás necesarias se menciona en el constructor. El pestillo de cuenta regresiva también se puede usar para esperar a que los subprocesos terminen de ejecutarse para que el subproceso principal pueda continuar más (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
}
}