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?
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?
Antworten:
Um die Threads genau zur gleichen Zeit zu starten (mindestens so gut wie möglich), können Sie einen CyclicBarrier verwenden :
// 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");
Dies muss kein a sein CyclicBarrier, Sie können auch ein CountDownLatchoder 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.
CreateEvent. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
Zumindest 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 CyclicBarrierist ein großartiges Werkzeug. Ich habe die Frage beantwortet, ob es möglich ist, mehrere Threads genau gleichzeitig zu starten . CyclicBarriergarantiert, 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.
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.
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
}
}