Les threads devraient commencer à la même fraction de seconde. Je comprends que si vous le faites thread1.start()
, il faudra quelques millisecondes avant la prochaine exécution de thread2.start()
.
Est-ce même possible ou impossible?
java
multithreading
Figaro
la source
la source
Réponses:
Pour démarrer les threads exactement au même moment (au moins aussi bon que possible), vous pouvez utiliser un CyclicBarrier :
Cela ne doit pas nécessairement être un
CyclicBarrier
, vous pouvez également utiliser unCountDownLatch
ou même un verrou.Cela ne permet toujours pas de s'assurer qu'ils sont démarrés exactement au même moment sur les JVM standard, mais vous pouvez vous en approcher assez. 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 différent de threads qui l'atteignent, vous souhaitez utiliser ce type de construction pour obtenir le résultat le plus précis possible.
Sur d'autres plates-formes, démarrer exactement les threads peut être une exigence très valide btw.
la source
CreateEvent
. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspxCe n'est pas possible, du moins sur un ordinateur à un seul cœur. Mais pourquoi veux-tu ça? Même si vous avez pu démarrer deux threads exactement à la même seconde, ils progresseront différemment car la planification n'est pas sous votre contrôle.
Edit: (En réponse à certains des commentaires) C'est une exigence parfaitement valide pour synchroniser l'état ou la progression de plusieurs threads et
CyclicBarrier
c'est un excellent outil. J'ai répondu à la question de savoir s'il est possible de démarrer plusieurs threads exactement en même temps .CyclicBarrier
garantira que les threads se déroulent quand ils sont 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.la source
Vous pouvez utiliser un CountDownLatch pour cela. Veuillez trouver ci-dessous un échantillon. Bien que t1 et t2 soient démarrés, ces threads continuent d'attendre jusqu'à ce que le thread principal décompte le verrou. Le nombre de comptes à rebours requis est mentionné dans le constructeur. Le verrou du compte à rebours peut également être utilisé pour attendre la fin de l'exécution des threads afin que le thread principal puisse continuer (le cas inverse). Cette classe est incluse depuis Java 1.5.
la source
la source