1.) Was ist der Unterschied zwischen Thread und Runnable? Zwei Beispiele (erstes aus Java Insel 6, zweites ein kleines Programm von mir):
Code:
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
Code:
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?
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.
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.
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.
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.
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.
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:
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?