Unterschied bei Thread Erstellung

Semox

Bekanntes Mitglied
Liebes Forum

Was ist der Unterschied, wenn ich eine Klasse mit "implements Runnable" oder mit "extends Thread" erstelle? In beiden Fällen habe ich die run() Methode, die implementiert werden muß. Ich verstehe das nicht so ganz, was das für Folgen hat. :rtfm:

Anbei habe ich zwei Klassen, die sich mit diesem Thema beschäftigen und beide o.g. Möglichkeiten innerhalb inneren Klassen benutzt. Einen Unterschied konnte ich da in der Ausführung nicht feststellen.

Diese Klasse liefert den Grundaufbau für eine Heizung
Java:
public class Heizung  {
	private double temp;
	private double minTemp;
	private double maxTemp;

	public Heizung(double temp, double minTemp, double maxTemp) {
		super();
		this.temp = temp;
		this.minTemp = minTemp;
		this.maxTemp = maxTemp;
	}

	double getMaxTemp() {
		return maxTemp;
	}

	double getMinTemp() {
		return minTemp;
	}

	double getTemp() {
		return temp;
	}

	/* Methode zur Temperaturerhoehung um tempDiff Grad */
	void erhoeheTemp(double tempDiff) {
		this.temp += tempDiff;
	}

	/* Methode zur Temperaturverringerung um tempDiff Grad */
	void verringereTemp(double tempDiff) {
		this.temp -= tempDiff;
	}

	/**
	 * Methode zur schrittweisen Temperaturerhoehung (temp) bis die
	 * Maximaltemperatur maxTemp erreicht ist
	 */
	public void heizen() {
		while (temp < maxTemp) {
			this.erhoeheTemp(0.000001);
		}
	}
}


Diese Klasse spielt sozusagen die fluktuierende Raumtemperatur und weißt die Heizung an Wärme zu erzeugen oder eben nicht.
Java:
public class Thermostat {

	Heizung h = new Heizung(12, 18, 24);

	public static void main(String[] args) {
		Thermostat therm = new Thermostat();
		Senken s = new Senken(therm.h);
		Erhoehen er = new Erhoehen(therm.h);
		Messen m = new Messen(therm.h);
		
		Thread th1 = new Thread(s);
		Thread th2 = new Thread(er);
		Thread th3 = new Thread(m);
		
		th1.start();
		th2.start();
		th3.start();

	}

}

class Senken implements Runnable {

	private Heizung h;

	public Senken(Heizung h) {
		this.h = h;
	}

	public void run() {
		while (true) {
			h.verringereTemp(0.2);
			try {
				Thread.sleep(1);
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}

	}
}

class Erhoehen extends Thread {
	private Heizung h;

	public Erhoehen(Heizung h) {
		this.h = h;
	}

	public void run() {
		while (true) {
			if (h.getTemp() <= h.getMinTemp()) {
				h.heizen();
			}
			try {
				Thread.sleep(1);
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}

	}
}

class Messen extends Thread {
	private Heizung h;

	public Messen(Heizung h) {
		this.h = h;
	}

	public void run() {
		while (true) {
			System.out.println(h.getTemp());
			try {
				Thread.sleep(1);
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}
}

Viele Grüße,
Semo
 

VfL_Freak

Top Contributor
Moin,

Was ist der Unterschied, wenn ich eine Klasse mit "implements Runnable" oder mit "extends Thread" erstelle? In beiden Fällen habe ich die run() Methode, die implementiert werden muß. Ich verstehe das nicht so ganz, was das für Folgen hat. :rtfm:

extends und implements dienen der Vererbung:
extends der genetischen Erweiterungsvererbung von Klasse zu Klasse oder Interface zu Interface
implements der Implementierungsvererbung von Interface zu Klasse.
Außerdem wird extends bei Generics für Typerweiterung verwendet.

Quelle: Java-Syntax ? Wikipedia
oder auch Galileo Computing :: Java ist auch eine Insel (8. Auflage) ;)

Gruß
Klaus
 

Semox

Bekanntes Mitglied
Hallo VfL_Freak

Danke für die Antwort. Der unmittelbare Unterschied dieser Schlüsselwörter ist mir bekannt.

Der Schwerpunkt meiner Frage bezieht sich aber auf etwas Anderes. Wann wird "extends Thread" oder "implements Runnable" genutzt?

Grüße,
Semo
 

VfL_Freak

Top Contributor
Moin,

Der Schwerpunkt meiner Frage bezieht sich aber auf etwas Anderes. Wann wird "extends Thread" oder "implements Runnable" genutzt?

"Class AAA extends Thread" : leitet die Klasse "Thread" ab und/muss kann Deiner Klasse AAA überschrieben werden
EDIT: So musst Du hierbei bspw. die Methode "run()" in AAA überschreiben

"Class AAA implements Runnable" : Deine Klasse AAA benutzt alles aus dem Interface "Runnable";
die Inhalte von "Runnable" können nicht überschrieben werden!

Es kommt also drauf an, was Du in der Klasse AAA willst :)
Jetzt klarer ??

Gruß
Klaus
 
Zuletzt bearbeitet:
S

SlaterB

Gast
also mir wird dadurch auch nix klarer ;)

von Thread zu erben ist quasi nie nötig, es ist nur bisschen einfacher,
- man kann gleich myThread.start() schreiben statt new Thread(myRunnable).start(),
- man hat das Thread-Objekt immer zur Hand, wenn man es etwa für interrupt()/ wait()/ notitfy() verwendet,
ansonsten nur das Runnable, das Thread-Objekt ist in einer extra Variablen zu speichern oder weg,

wenn der Thread selber läuft kann er sein Thread-Objekt noch mit der statischen Methode Thread.currentThread() holen,
wenn aber jemand anders interrupt() aufrufen will wird es ohne Referenz aufwendig

----

nur das Interface zu implementieren ist generell sauberer

in jedem Fall die schrecklichste Variante ist
> Erhoehen er = new Erhoehen(therm.h);
> Thread th2 = new Thread(er);
wobei Erhoehen von Thread erbt, dann ist 'er' nämlich ein toter/ noch ungeborener Thread, dessen run-Methode von einem anderen Thread ausgeführt wird,
brrrr
 
Zuletzt bearbeitet von einem Moderator:

eRaaaa

Top Contributor
eig. hat SlaterB ja schon alles gesagt, aber vllt noch ein kleiner Zusatz, folgendes steht so in der Javadoc:
http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html hat gesagt.:
In most cases, the Runnable interface should be used if you are only planning to override the run() method and no other Thread methods. This is important because classes should not be subclassed unless the programmer intends on modifying or enhancing the fundamental behavior of the class.
 

Ralph-Uwe

Bekanntes Mitglied
Hallo,

die java Vererbungslehre besagt, dass eine Klasse nur von einer Elternklasse erben darf (extends).
Wenn eine Klasse von zum Beispiel JFrame erbt, kann zusätzlich nicht von Thread geerbt werden.

Ein Klasse kann aber um mehrere Interface erweitert werden (implements).

Aus diesem Grund gibt es das Interface Runnable, so könnte eine Klassen
von JFrame erben und gleichzeitig das Interface Runnable implementieren
und Thread verarbeiten.
 
S

SlaterB

Gast
technisch gesehen richtig und ein wichtiger Punkt,
allerdings klingt das stark nach 'ansonsten immer erben', was doch nun wirklich gerade nicht so das Vorbild sein sollte ;)

JFrame ist eine der wenigen Ausnahmen, extends JFrame liest man fast überall, obwohl es auch da strenggenommen nicht nötig ist
und dort ist dann auch nichtmal ein Interface als Alternative nötig,
es ginge auch einfach

Java:
class MyGUI {
   private JFrame frame;
  
   public MyGUI() {
     frame = ..;
     frame.add(..);
     ..
  }
}
 
Zuletzt bearbeitet von einem Moderator:

Ralph-Uwe

Bekanntes Mitglied
alles richtig.
JFrame sollte auch nur als Beispiel für eine x-beliebige Klasse dienen.
Ansonsten sollte es zeigen, dass man auf der einen Seite von Thread erben kann
bzw. Runnable als Interface implementieren kann.

Dardurch wird der Unterschied deutlich.
 

Semox

Bekanntes Mitglied
Eine schöne Diskussion. ;-)

Da erscheint es mir grundsätzlich fragwürdig, ob man sich dann nicht von Java Spezifikationsseite her grundsätzlich das extends Thread kneifen kann. Das ist, so wie ich das durch Euch bisher verstehe sogar sehr gefährlich, weil man dann grobe Threads erstellt, die losgelöst arbeiten und andere Programmteile in ihrer Ausführung behindern, da wohl nie eine Beendigung eines so erzeugten Threads sauber gewährleistet.

Als Beispiel: Man kann dann nicht mehr sowas nettes wie FutureTask() nutzen, da es keine direkte Verbindung zu diesen grobschlächtigen Threads gibt. Ist es aber nicht das was gutes Concurrent Programming ausmacht?

Viele Grüße,
Semo

EDIT: Doofe Grammtick
 
S

SlaterB

Gast
extends Thread verbieten scheint mir denkbar, so wie die Klasse String schon final ist,
hab jetzt extra nochmal kurz bei google geschaut, kein Argument dafür gefunden,
aber man kann es ja auch lassen falls das irgendjemand besser gefällt,

> sehr gefährlich
ist bisschen übertrieben

> weil man dann grobe Threads erstellt
was ist denn ein 'grober' Thread?

> die losgelöst arbeiten und andere Programmteile in ihrer Ausführung behindern
jeder Thread arbeitet losgelöst und behindert in gewisser Weise andere, wo siehst du Unterschiede?

> da wohl nie eine Beendigung eines so erzeugten Threads sauber gewährleistet
ein Thread geht zu Ende, wenn run() ausläuft, das sollte bei extends oder implements nicht anders sein

FutureTask oder andere höhere Frameworks sind sicherlich netter wenn sie alle Anforderungen gut erfüllen,
aber das sind auch nur reine Java-Klassen, die intern Threads verwenden,

was die können kann man genausogut auch selber bauen, Thread an sich ist nicht schlecht(er)
 

Ullenboom

Bekanntes Mitglied
Hallo,

vom rein technischen Standpunkt ist es egal, da beide Ansätze das Problem lösen. Betrachtet man das als Stilfrage ist es anders. Unter dem Vorzeichen kann man sagen, dass extends Thread veraltet ist. Der Grund ist einfach: Eigene Threads baut man heute nicht mehr auf, sondern man gibt sie an Excecutor, die sich um die Abarbeitung der Runnables kümmern.

Grüße

Christian
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Unterschied EventQueue.invoke... und thread.start() Allgemeine Java-Themen 4
G Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread Allgemeine Java-Themen 2
T Unterschied Dämon - Thread (läuft später auf RMI hinaus...) Allgemeine Java-Themen 6
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
L Unterschied zwischen List und LinkedList implementierung? Allgemeine Java-Themen 15
P Unterschied Java SE und Java EE Allgemeine Java-Themen 2
J Unterschied: Polymorphie und Dynamisches Binden Allgemeine Java-Themen 8
VfL_Freak JDK installieren Unterschied zw. JDK 8_151 und 8_152 Allgemeine Java-Themen 3
F Unterschied zwischen NormalizedValue und Value Allgemeine Java-Themen 5
T Unterschied Oracle JDK 8u111 8u112 Allgemeine Java-Themen 3
W Unterschied Standalone und Applet Allgemeine Java-Themen 1
O [log4J] Unterschied SocketServer <-> SimpleSocketServer Allgemeine Java-Themen 0
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
M Unterschied zwischen Win 7/2008R2 und Win8.1/2012R2? Allgemeine Java-Themen 8
M Unterschied CPU Auslastung Allgemeine Java-Themen 0
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
N Unterschied Hobby-Codung und Professionelle Softwareentwicklung Allgemeine Java-Themen 5
D Unterschied Vererbung und Polymorphie? Allgemeine Java-Themen 4
G UnterSchied OpenJDK vs JDK Allgemeine Java-Themen 11
G Unterschied MyClass.class vs this Allgemeine Java-Themen 2
D Exakte Unterschied zwischen diesen Elementen? Allgemeine Java-Themen 5
N Unterschied zwischen "Java" und "Java mit Eclipse" Allgemeine Java-Themen 17
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
Lufti Unterschied zwischen Djava.library.path und Class-Path im Manifest? Allgemeine Java-Themen 2
B Unterschied zwischen Klasse und Objekt? Allgemeine Java-Themen 8
G Unterschied Enterprise Anwendung und Web Anwendung Allgemeine Java-Themen 30
B Gibt es einen Unterschied zwischen Java 1.2 und Java 2? Allgemeine Java-Themen 7
J Unterschied zwischen "Debug" und "Run" Allgemeine Java-Themen 16
Q Unterschied der Logger Allgemeine Java-Themen 9
G Unterschied Long - Int Allgemeine Java-Themen 9
A Unterschied Scanner und Matcher Allgemeine Java-Themen 5
M Unterschied der java.exe des JDK und der JRE Allgemeine Java-Themen 15
P Unterschied zwischen Funktion und Methoden Allgemeine Java-Themen 3
K Unterschied Compilierung Eclipse 3.2 und Ant Allgemeine Java-Themen 3
O Unterschied zwischen ThreadPoolExecutor und Executor Service Allgemeine Java-Themen 7
O Unterschied zwischen Semaphoren/Lock und ExecutorService Allgemeine Java-Themen 3
V Unterschied FileOutputStream und FileWriter? Allgemeine Java-Themen 8
I Unterschied zwischen Applet und JApplet Allgemeine Java-Themen 2
B Unterschied: jar <-> konsole Allgemeine Java-Themen 9
G Unterschied abstrakte Klasse und Interface? Allgemeine Java-Themen 3
R Der Unterschied zwischen 2.1 und 2.10 Allgemeine Java-Themen 2
T abstract - interface Unterschied Allgemeine Java-Themen 22
K Unterschied Core Java / Desktop Allgemeine Java-Themen 12
P Was ist der Unterschied zwischen JSP und Servlet ? Allgemeine Java-Themen 4
J Unterschied PrintJob & PrinterJob Allgemeine Java-Themen 11
M Unterschied notify() und notifyAll() Allgemeine Java-Themen 1
N Unterschied Calendar und GregorianCalendar Allgemeine Java-Themen 9
S Unterschied zwischen notify() und notifyAll() Allgemeine Java-Themen 2
M Unterschied zwischen // und \\ Allgemeine Java-Themen 6
E Unterschied zwischen Adapterklassen und abstracten Klassen? Allgemeine Java-Themen 5
B Unterschied: Java - Java 2 Allgemeine Java-Themen 5
B (String) und toString(), woliegt der Unterschied? Allgemeine Java-Themen 4
B Ressourcenleck durch (virtuellen/echten) Thread Allgemeine Java-Themen 11
B Generator mit virtuellem Thread Allgemeine Java-Themen 62
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
smarterToby Wie stoppe ich diesen Thread Allgemeine Java-Themen 4
A Thread.sleep Problem Allgemeine Java-Themen 2
J Thread started nur einmal Allgemeine Java-Themen 19
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
OnDemand Thread / Service abbrechen Allgemeine Java-Themen 3
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
S Ist das Neuzuweisen von Feldern atomic und damit Thread-Safe? Allgemeine Java-Themen 2
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
Flynn Thread-Problem... Allgemeine Java-Themen 2
G Thread-Programmierung Allgemeine Java-Themen 5
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
G Beendet sich der Thread selbst?! Allgemeine Java-Themen 3
mrbig2017 Sleep wird ignoriert und der Thread wartet nicht Allgemeine Java-Themen 1
S Thread beenden Allgemeine Java-Themen 9
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
Aruetiise Swing JOptionPane ohne denn Thread zu pausieren Allgemeine Java-Themen 1
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Merkwürdiges Thread-Verhalten Allgemeine Java-Themen 6
K Thread Problem Allgemeine Java-Themen 6
W Thread sleep 30 sekunden - wenn keine Antwort bis dahin neu senden Allgemeine Java-Themen 2
H Thread bleibt stehen bei jar in jar Allgemeine Java-Themen 1
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
Tausendsassa Threads Einen Thread sich selbst schließen lassen Allgemeine Java-Themen 17
P Threads BufferedImage, Thread Concurrency Allgemeine Java-Themen 1
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
llabusch Thread blockiert Dialog Allgemeine Java-Themen 1
J Thread wait() Allgemeine Java-Themen 2
V Thread.sleep und InterruptedException? Allgemeine Java-Themen 1
G Thread nicht von GC zerstört Allgemeine Java-Themen 6
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
Sogomn Thread blocken bis Taste gedrückt Allgemeine Java-Themen 5
T Starten vom Thread Allgemeine Java-Themen 3
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben