Comment démarrer deux threads au même moment

Les threads doivent commencer à la même seconde. Je comprends, si vous faites thread1.start() , il faudra quelques millisecondes avant la prochaine exécution de thread2.start() .

Est-ce même possible ou impossible?

Pour démarrer les threads exactement au même moment (au moins aussi bien que possible), vous pouvez utiliser 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"); 

Cela ne doit pas nécessairement être un CyclicBarrier , vous pouvez également utiliser un CountDownLatch ou même un verrou.

Cela ne permet toujours pas de s’assurer qu’ils sont lancés exactement en même temps sur les machines virtuelles Java standard, mais vous pouvez vous en approcher. Se rapprocher est toujours utile lorsque vous effectuez, par exemple, des tests de performances. Par exemple, si vous essayez de mesurer le débit d’une structure de données avec un nombre de threads différent, vous souhaitez utiliser ce type de construction pour obtenir le résultat le plus précis possible.

Sur d’autres plates-formes, les threads de démarrage peuvent être une exigence très valable.

Ce n’est pas possible, du moins sur un seul ordinateur. Mais pourquoi tu veux ça? Même si vous avez pu démarrer deux threads exactement au même moment, ils progresseront différemment car la planification n’est pas sous votre contrôle.

Edit: (En réponse à certains commentaires) C’est une exigence parfaitement valide pour synchroniser l’état ou la progression de plusieurs threads et CyclicBarrier est un excellent outil. J’ai répondu à la question de savoir s’il était possible de démarrer plusieurs threads exactement au même moment . CyclicBarrier garantira que les threads se dérouleront exactement à l’état souhaité, mais cela ne garantit pas qu’ils démarreront ou reprendront exactement au même moment, bien que cela puisse être assez proche. Il n’y a aucune mention des besoins de synchronisation dans la question.

Vous pouvez utiliser un CountDownLatch pour cela. Veuillez trouver ci-dessous un échantillon. Bien que t1 et t2 soient démarrés, ces threads attendent que le thread principal décompte le verrou. Le nombre de comptes à rebours requirejs est mentionné dans le constructeur. Le compte à rebours peut également être utilisé pour attendre que les threads finissent leur exécution afin que le thread principal puisse continuer (le cas inverse). Cette classe a été incluse depuis Java 1.5.

 import java.util.concurrent.CountDownLatch; public class ThreadExample { public static void main(Ssortingng[] 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. Si je comprends bien, la machine virtuelle Java délègue principalement ces éléments au système d’exploitation. La réponse sera donc spécifique au système d’exploitation.
  2. Il est clairement impossible sur des machines monoprocesseurs.
  3. C’est plus compliqué avec une machine multiprocesseur. Selon la relativité de la simultanéité , “il est impossible de dire dans un sens absolu si deux événements se produisent simultanément si ces événements sont séparés dans l’espace”. Quelle que soit la proximité de vos processeurs, ils sont séparés dans l’espace.
    1. Si vous pouvez accepter une simultanéité relative, il est probablement plus simple de le simuler en utilisant les techniques décrites dans d’autres réponses.