# Unterschied Thread und Runnable?



## Daniel_L (23. Apr 2007)

Hallo,

ich habe zwei Fragen zu Threads:

*1.)* Was ist der Unterschied zwischen Thread und Runnable? Zwei Beispiele (erstes aus Java Insel 6, zweites ein kleines Programm von mir):


```
public class DateCommand implements Runnable { 
	public void run() { 
		for ( int i = 0; i < 20; i++ ) System.out.println( new java.util.Date() );
	}
}

Thread t1 = new Thread( new DateCommand() );
t1.start();
```

und


```
class MaleFraktale extends Thread {
    /**
     * Diese Funktion wird ausgeführt, wenn der Thread 
     * per "start()" gestartet wird
     */
    public void run() {

        // solange der Thread aktiv ist, Zeichenfunktion durchführen
        while(!isInterrupted()) {

            // Zuerst das Mandelbrot initiieren,
            // damit jedesmal eine zufällige Fraktalform erscheint
            InitMandel();

            // danach das Mandelbrot zeichnen
            ZeichneMandel();            

            // kurze pause einlegen, damit nicht zu schnell
            try {
                // 5 Sekunden warten
                sleep(5000);
            } catch(InterruptedException e) {
                return;
            }
        }
    }
}


meinThread = new MaleFraktale(zeichenflaeche);
meinThread.start();
```


Ist das nach Belieben des Autors oder gibt es Regeln, wann besser Fall1 und wann eher Fall2 zur Anwendung kommen sollte?

*Und Frage 2:* Warum muss (so hab ich gelesen) im 2. Beispiel ein try/catch in die Run-Methode, im ersten Fall aber nicht?


Gruß
Daniel


----------



## Wildcard (23. Apr 2007)

1) Runnable ist ein Interface, Thread eine Klasse.
Da es keine Mehrfachvererbung von Klassen gibt scheidet der Thread immer aus wenn deine Klasse bereits eine Superklasse hat, daher verwendet man meistens Runnable da dann alle Möglichkeiten offen stehen.
2)Im ersten Code-Snippet ist kein Code der die Exception auslösen könnte, also muss man sie auch nicht fangen.


----------



## Leroy42 (23. Apr 2007)

1. Die Klasse Thread ist vorzuziehen, wenn du Methoden dieser Klasse brauchst, ansonsten Runnable

2. Die Try-Catch-Anweisung ist wegen des sleep-Aufrufs notwendig, da während
der Schlafphase _von außen_ ein interrupt() auf den Thread aufgerufen
werden könnte. Wenn du sleep benutzst mußt du auch in einem Runnable-Objekt
dieses mit try-catch versehen.


----------



## Daniel_L (23. Apr 2007)

Wildcard hat gesagt.:
			
		

> 1) Runnable ist ein Interface, Thread eine Klasse.
> Da es keine Mehrfachvererbung von Klassen gibt scheidet der Thread immer aus wenn deine Klasse bereits eine Superklasse hat, daher verwendet man meistens Runnable da dann alle Möglichkeiten offen stehen.
> 2)Im ersten Code-Snippet ist kein Code der die Exception auslösen könnte, also muss man sie auch nicht fangen.



Alles klar, vielen Dank. Wenn ich das richtig verstehe, macht man mit Runnable generell nichts verkehrt?


----------



## Daniel_L (23. Apr 2007)

Leroy42 hat gesagt.:
			
		

> 1. Die Klasse Thread ist vorzuziehen, wenn du Methoden dieser Klasse brauchst, ansonsten Runnable
> 
> 2. Die Try-Catch-Anweisung ist wegen des sleep-Aufrufs notwendig, da während
> der Schlafphase _von außen_ ein interrupt() auf den Thread aufgerufen
> ...



Super, vielen Dank für die schnelle Hilfe.


----------



## byte (23. Apr 2007)

Ich würde immer den Weg über das Runnable bevorzugen! Nicht zuletzt, da es seit Java 5 interessante Neuerungen in dem Bereich gibt und man es somit u.a. der VM überlassen kann, die Threads zu managen.


----------



## Leroy42 (23. Apr 2007)

Ich schließe mich byto an.

Vor allem deshalb, weil man die Thread-Methoden
wie setPriority(..)... auch aus einem Runnable mit
Thread.getCurrentThread().setPriority(...) problemlos
aufrufen kann.

Ich selbst habe bis heute nicht ein einzigesmal von
Thread abgeleitet sondern immer nur von Runnable.  :meld:


----------



## Guest (31. Jul 2007)

Wildcard hat gesagt.:
			
		

> 2)Im ersten Code-Snippet ist kein Code der die Exception auslösen könnte, also muss man sie auch nicht fangen.



I will meinen bestehenden Code auch ändern von Thread auf Runnable benutzen. Nun frage ich mich ob ich einen try/catch block. In der Run methode wird über die Runtime ein eine .exe datei (7zip.exe) aufgerufen um eine rechtsgeklickte datei zu komprimieren. Brauche ich da eine try/catch methode in der class mit der implementieren Runnable?


----------



## Gast (31. Jul 2007)

und wenn ich einen try/catch für die exception abfangen benötige, benötige ich dann auch eine while schleife ala:

while (!isInterrupted())


----------

