Die Threads sollten im gleichen Sekundenbruchteil beginnen. Ich verstehe, wenn Sie dies tun thread1.start()
, wird es einige Millisekunden dauern, bis die nächste Ausführung von thread2.start()
.
Ist es überhaupt möglich oder unmöglich?
java
multithreading
figaro
quelle
quelle
Antworten:
Um die Threads genau zur gleichen Zeit zu starten (mindestens so gut wie möglich), können Sie einen CyclicBarrier verwenden :
Dies muss kein a sein
CyclicBarrier
, Sie können auch einCountDownLatch
oder sogar ein Schloss verwenden.Dies kann immer noch nicht sicherstellen, dass sie auf Standard-JVMs genau zur gleichen Zeit gestartet werden , aber Sie können ziemlich nah dran sein. Wenn Sie beispielsweise Leistungstests durchführen, ist es immer noch nützlich, sich ganz nah zu kommen. Wenn Sie beispielsweise versuchen, den Durchsatz einer Datenstruktur mit einer unterschiedlichen Anzahl von Threads zu messen, möchten Sie diese Art von Konstrukt verwenden, um ein möglichst genaues Ergebnis zu erzielen.
Auf anderen Plattformen beginnen Threads genau können btw eine sehr gültige Anforderung sein.
quelle
CreateEvent
. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspxZumindest auf einem Single-Core-Computer ist dies nicht möglich. Aber warum willst du das? Selbst wenn Sie zwei Threads genau in derselben Sekunde starten konnten, werden sie unterschiedlich ausgeführt, da die Planung nicht in Ihrer Kontrolle liegt.
Bearbeiten: (als Antwort auf einige der Kommentare) Es ist eine absolut gültige Anforderung, den Status oder den Fortschritt mehrerer Threads zu synchronisieren, und es
CyclicBarrier
ist ein großartiges Werkzeug. Ich habe die Frage beantwortet, ob es möglich ist, mehrere Threads genau gleichzeitig zu starten .CyclicBarrier
garantiert, dass die Threads fortgesetzt werden, wenn sie sich genau im gewünschten Zustand befinden, garantiert jedoch nicht, dass sie genau zur gleichen Zeit gestartet oder fortgesetzt werden, obwohl dies möglicherweise ziemlich eng ist. In der Frage werden keine Synchronisationsanforderungen erwähnt.quelle
Sie können hierfür einen CountDownLatch verwenden. Nachfolgend finden Sie ein Beispiel. Obwohl t1 und t2 gestartet werden, warten diese Threads so lange, bis der Haupt-Thread die Verriegelung herunterzählt. Die Anzahl der erforderlichen Countdowns wird im Konstruktor angegeben. Der Countdown-Latch kann auch verwendet werden, um zu warten, bis die Ausführung der Threads abgeschlossen ist, damit der Haupt-Thread weiter fortfahren kann (im umgekehrten Fall). Diese Klasse wurde seit Java 1.5 aufgenommen.
quelle
quelle