2355 Stimmen

"implementiert Runnable" vs. "erweitert Thread" in Java

Nach der Zeit, die ich mit Threads in Java Ich habe diese beiden Möglichkeiten gefunden, Themen zu schreiben:

Mit implementiert Runnable :

public class MyRunnable implements Runnable {
    public void run() {
        //Code
    }
}
//Started with a "new Thread(new MyRunnable()).start()" call

Oder, mit erweitert Thread :

public class MyThread extends Thread {
    public MyThread() {
        super("MyThread");
    }
    public void run() {
        //Code
    }
}
//Started with a "new MyThread().start()" call

Gibt es einen signifikanten Unterschied zwischen diesen beiden Codeblöcken?

66 Stimmen

Vielen Dank für diese Frage, die Antworten haben eine Menge Missverständnisse, die ich hatte, aufgeklärt. Ich schaute in den richtigen Weg, um Java-Threads zu tun, bevor SO existierte und es gab eine Menge von Fehlinformationen / veraltete Informationen da draußen.

5 Stimmen

Gibt es einen Grund, warum Sie den Thread ( aber ich empfehle es nicht ), können Sie präventiv mit interrupt() . Auch hier handelt es sich um eine Idee, die im richtigen Fall nützlich sein könnte, aber ich empfehle sie nicht.

0 Stimmen

Bitte lesen Sie auch die Antwort, die sehr gut erklärt ist: stackoverflow.com/q/5562720/285594

5voto

Ich finde es am nützlichsten, Runnable aus den genannten Gründen zu verwenden, aber manchmal möchte ich Thread erweitern, damit ich meine eigene Methode zum Anhalten des Threads erstellen und sie direkt auf dem von mir erstellten Thread aufrufen kann.

5voto

Manoj Kumar Punkte 587

Ja, Wenn Sie ThreadA aufrufen, dann brauchen Sie die Startmethode nicht aufzurufen und die Run-Methode wird nur nach dem Aufruf der ThreadA-Klasse aufgerufen. Aber wenn Sie den ThreadB-Aufruf verwenden, müssen Sie den Start-Thread für den Aufruf der Run-Methode benötigen. Wenn Sie mehr Hilfe haben, antworten Sie mir.

5voto

Himanshu Mohta Punkte 1003

Java unterstützt keine Mehrfachvererbung. Wenn Sie also die Klasse Thread erweitern, wird keine andere Klasse erweitert werden.

Zum Beispiel: Wenn Sie ein Applet erstellen, muss es die Klasse Applet erweitern, so dass hier die einzige Möglichkeit, einen Thread zu erstellen, die Implementierung der Schnittstelle Runnable ist

5voto

veritas Punkte 2366

Ich füge hier meine zwei Cents hinzu - Verwenden Sie nach Möglichkeit immer implements Runnable . Nachfolgend finden Sie zwei Hinweise, warum Sie Folgendes nicht verwenden sollten extends Thread s

  1. Idealerweise sollten Sie niemals die Thread-Klasse erweitern; die Thread Klasse gemacht werden sollte final . Zumindest seine Methoden wie thread.getId() . Siehe este Diskussion über einen Fehler im Zusammenhang mit der Erweiterung Thread s.

  2. Diejenigen, die gerne Rätsel lösen, können einen weiteren Nebeneffekt der Erweiterung von Thread erkennen. Der folgende Code wird unerreichbaren Code ausgeben, wenn niemand ihn benachrichtigt.

Siehe bitte http://pastebin.com/BjKNNs2G .

public class WaitPuzzle {

    public static void main(String[] args) throws InterruptedException {
        DoNothing doNothing = new DoNothing();
        new WaitForever(doNothing).start();
        new WaitForever(doNothing).start();
        new WaitForever(doNothing).start();
        Thread.sleep(100);
        doNothing.start();
        while(true) {
            Thread.sleep(10);
        }
    }

    static class WaitForever extends  Thread {

        private DoNothing doNothing;

        public WaitForever(DoNothing doNothing) {
            this.doNothing =  doNothing;
        }

        @Override
        public void run() {
            synchronized (doNothing) {
                try {
                    doNothing.wait(); // will wait forever here as nobody notifies here
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Unreachable Code");
            }
        }
    }

    static class DoNothing extends Thread {

        @Override
        public void run() {
            System.out.println("Do Nothing ");
        }
    } 
}

5voto

Rohit Chugh Punkte 109

Unterschied zwischen Thread und runnable Wenn wir einen Thread mit der Klasse Thread erstellen, ist die Anzahl der Threads gleich der Anzahl der von uns erstellten Objekte. Wenn wir einen Thread erstellen, indem wir die Runnable-Schnittstelle implementieren, können wir ein einzelnes Objekt für die Erstellung mehrerer Threads verwenden, d.h. ein einzelnes Objekt wird von mehreren Threads gemeinsam genutzt und benötigt daher weniger Speicher.

Es hängt also von der Anforderung ab, ob unsere Daten nicht aussagekräftig sind. So kann es zwischen mehreren Threads geteilt werden, können wir Runnable-Schnittstelle verwendet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X