Ich habe den folgenden Code:Wie läuft der Haupt-Thread vor diesem Thread?
public class Derived implements Runnable {
private int num;
public synchronized void setA(int num) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("Setting value " + Thread.currentThread().getName());
this.num = num;
}
@Override
public void run()
{
System.out.println("In run: " + Thread.currentThread().getName());
setA(20);
}
public static void main(String[] args) {
Derived obj = new Derived();
Thread t1 = new Thread(obj);
t1.start();
obj.setA(32);
}
}
Diese Drucke:
In run: Thread-0
Setting value main
Setting value Thread-0
Meine Frage ist, wenn ich den Faden ‚t1‘ zuerst, und es trat in die run-Methode wie die Ausgabe zeigt der Autor, wie come main thread konnte setA vor 't1' aufrufen, wenn das Objekt von t1 gesperrt wurde? (oder sogar bevor eine Sperre auf 'obj' main konnte eine Sperre bekommen) Ist es nur der Scheduler oder denke ich es falsch?
Es gibt keine Garantien über die Bestellung mit Threads, es sei denn, Sie nehmen explizite Schritte, um sie zu synchronisieren. Das ist der springende Punkt von Threads, sie sind asynchron. –
Der Haupt-Thread läuft bereits, wenn dieser Code aufgerufen wird. Ihr anderer Thread wird nur ein bisschen Zeit brauchen, um aufgebaut und ausgeführt zu werden, und so bin ich nicht überrascht über das Ergebnis, das Sie sehen. Plus was @JimGarrison oben gesagt hat. –
Ihr Code sollte auch nicht kompilieren - Sie haben eine Runnable ohne 'run()' Methode. –