2015-09-20 3 views
5

Ein super() wird verwendet, um den Konstruktor der Superklasse aus dem Konstruktor der Unterklasse auszuführen. In diesem Programm bleibt die Ausgabe mit oder ohne super() innerhalb des Konstruktors gleich. Könnten Sie bitte den Unterschied erklären, ob Sie in diesem Szenario Super() haben und nicht haben?Threads Beginner: Was ist der Sinn der Verwendung einer super() -Methode innerhalb des Konstruktors der Unterklasse (extending Thread class)?

class SomeThread extends Thread { 
    String ThreadName; 

    SomeThread(String ThreadName) { 
     super(ThreadName); //Why Oh Why ? 
     this.ThreadName = ThreadName; 
    } 

    public void run(){ 
     for(int ctr=1; ctr<=10; ctr++) { 
      System.out.println("From "+ThreadName+"...."+ctr); 
      try { 
       sleep(1000); 
      }catch(Exception e) { 
       System.out.println("Exception in "+ThreadName); 
      } 
     } 
    } 

} 

class ThreadAliveDemo { 
    public static void main(String[] args) throws Exception { 
     SomeThread FThread = new SomeThread("Some Child Thread"); 
     System.out.println("Some Child Thread is alive "+FThread.isAlive()); 

     FThread.start(); 

     System.out.println("Some Child Thread is running.."+FThread.isAlive()); 

     for(int ctr = 1; ctr<=5; ctr++) { 
     System.out.println("From.."+Thread.currentThread().getName()+"..."+ctr); 
     Thread.sleep(1000); 
     } 

     FThread.join(); 

     System.out.println("Some Child Thread is alive.."+FThread.isAlive()); 

     for(int ctr=6; ctr<=10; ctr++) { 
     System.out.println("From.."+Thread.currentThread().getName()+"..."+ctr); 
     Thread.sleep(1000); 
     } 
    } 
} 
+2

Warum erweitern Sie Thread in erster Linie? Wenn ich Sie wäre, würde ich einfach eine Klasse erstellen, die runnable implementiert und sie einem neuen Thread zuführt: 'new Thread (Runnable r)' oder nur eine Methode: 'new Thread (() -> method())' – Gelunox

+0

Aber das ist nicht meine Frage :) – tardycoder30

+2

@Gelunox Nichts an sich falsch mit der Erweiterung 'Thread'. – async

Antwort

5

Aufruf des Oberklassenkonstruktors Thread(String name) Sie explizit die System Thread-Namen festgelegt, die Sie später mit Thread.currentThread().getName() bekommen. Wenn Sie den Superklassenkonstruktor nicht explizit aufrufen, wird ein Standardkonstruktor verwendet, der den Standard-Thread-Namen wie Thread-1 zuweist. Diese Thread-Namen können im Debugger UI, in der Ausgabe jstack und so weiter angezeigt werden. Daher ist es eine gute Idee, Ihren Threads aussagekräftige Namen zuzuweisen. Wenn zum Beispiel Ihre aktuellen Code in Eclipse Debugger ausgeführt werden Sie sehen:

Thread name

So können Sie Thread [Some Child Thread] sehen. Aber wenn Sie diesen Super Anruf entfernen, sehen Sie folgende:

No thread name

Jetzt ist es nur Thread [Thread-0].

1

Die super(ThreadName);-Anweisung ruft den Thread(String name)-Konstruktor der Klasse Thread auf. Wie das Argument andeutet, setzt es den Namen des thread.

Während der Name thread in diesem Beispiel möglicherweise nicht direkt nützlich ist, kann der Name thread beim Debuggen nützlich sein, da Sie den Logs Ihrer Anwendung Thread-Namen hinzufügen können.

2

Wenn Sie den Aufruf von super machen tun, wie Sie getan haben, dann werden Sie den folgenden Konstruktor Aufruf am Ende nach der JavaDoc:

public Thread (String name)

Ordnet ein neues Thread-Objekt Dieser Konstruktor hat den gleichen Effekt wie Thread (null, null, name).

So super(ThreadName) ruft super(null, null, ThreadName).

Wenn Sie Ihren Anruf super(ThreadName) entfernen , dann wird die JVM den leeren Konstruktor aufrufen super() automatisch für Sie. Gemäß der JavaDoc Sie ein fast identisch Anruf wird am Ende:

Thema öffentlichen Thread() Ordnet ein neues Thread-Objekt. Dieser Konstruktor hat den gleichen Effekt wie

Thread (null, null, gname), wobei gname ein neu generierter Name ist. Automatisch erzeugte Namen haben die Form "Thread -" + n, wobei n eine ganze Zahl ist.

So super() ruft super(null, null, gname), wo gname ein automatisch generierter ist der Name für das Thread.

Der einzige Unterschied im Verhalten zwischen dem Aufrufen und nicht aufrufen von Super() ist die Zuweisung eines Thread-Namens.

Verwandte Themen