Frage

Die Ausgabe lautet: RunnableA ThreadB
Ich verstehe nicht, wie es kommt?(Was passiert in der Ausführungsmethode in Klasse B)

class A implements Runnable{
    public void run(){
        System.out.println("RunnableA");
    }
}
class B extends Thread{
    B(Runnable r){
        super(r);
    }
    public void run(){
        super.run();
        System.out.println("ThreadB");
    }
}
class Demo{
    public static void main (String []args){
        A a=new A();
        Thread t=new B(a);
        t.run();
    }
}

War es hilfreich?

Lösung

Sehen Sie sich die Implementierung der Ausführungsmethode der Thread-Klasse wie folgt an:

  public void run() {
    if (target != null) {
        target.run();
    }
    }

Wenn Sie also die run-Methode von Thread aufrufen, wird der Run der ausgeführten Runnable aufgerufen. In Ihrem Fall haben Sie beim Erstellen von Thread t die Instanz von A übergeben.Rufen Sie also super.run () auf, um die Ausführungsmethode der Thread-Klasse aufzurufen, die wiederum die Ausführungsmethode des A aufruft (das ausführbar ist oder das Ziel).

Andere Tipps

Wenn Sie super.run() in B#run aufrufen, wird Thread#run ausgeführt, und die nächste run-Methode der Instanz von Runnable, die Sie an den Konstruktor übergeben haben, wird ausgeführt.

Thread.run ruft einfach die run-Methode der von Ihnen angegebenen Runnable-Implementierung auf.Sie sollten jedoch NIEMALS Thread.run aufrufen, sondern Thread.start.

Weil Sie den B der Unterklasse haben und dessen Methode run() überschrieben haben.

Zuerst wird die Methode von B aufgerufen.

und im B von run() wird der Superaufruf gefunden, sodass der super von run() (der den Runnable des bereitgestellten run()s ausführt) zuerst aufgerufen und dann der B von run() ausgeführt wird

Als Sie das Objekt der Klasse B erstellt und a an es übergeben haben, wurde der Konstruktor der Klasse b aufgerufen. Was ist im Konstruktor von B? super (r); Dies setzt r als Super-Call. Wenn Sie jetzt t.run () sagen, wird hauptsächlich die überschriebene Methode der Klasse B aufgerufen, die die Ausführungsmethode des Objekts aufruft, an das Sie super gebunden haben, indem Sie super (r) sagen. Daher wird die Ausführungsmethode von a zuerst und aufgerufendann wird "ThreadB" gedruckt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top