Thread oder Nicht-Thread in Ticker-Applet

Status
Nicht offen für weitere Antworten.
L

Lukas L

Gast
Hallo

Ich bin im Web auf folgendes Lernbeispiel im Zusammenhang mit Applets gestossen - siehe Klasse Ticker. Es handelt sich um ein Applet, das mittels Thread einen Text als Ticker von links nach rechts laufend ausgibt. Zum Vergleich die Klasse Ticker2, die das gleiche macht ohne Thread. Was spricht gegen Ticker2? Wo ist der Vorteil bei der Thread-Variante? Vielen Dank für die Erklärung!

Code:
public class Ticker extends Applet implements Runnable {
	
	private String m_strText;
	private int m_intTextWidth;
	private Thread m_thread;
	private int m_intX;
	private int m_intY;

	private static final long serialVersionUID = 1L; // ???
	
	public void init() {
		FontMetrics fm;
		m_strText=this.getParameter("Text");
		fm=this.getFontMetrics(this.getFont());
		m_intTextWidth=fm.stringWidth(m_strText);
		m_intX=0-m_intTextWidth;
		m_intY=this.getSize().height/2;
	}
	
	public void paint(Graphics g) {
		g.drawString(m_strText, m_intX, m_intY);
	}
	
	public void start() {
		if (m_thread==null) {
			m_thread=new Thread(this);
			m_thread.start();
		}
	}
	
	public void stop() {
		m_thread=null;
	}

	public void run() {
		while (m_thread==Thread.currentThread()) {
			if (m_intX<this.getSize().width) {
				m_intX=m_intX+5;
			} else {
				m_intX=0-m_intTextWidth;
			}
			this.repaint();
			try {
				// Thread.sleep(100);
				m_thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}


Code:
public class Ticker2 extends Applet {

	private String m_strText;
	private int m_intTextWidth;
	private int m_intX;
	private int m_intY;

	private static final long serialVersionUID = 1L; // ???
	
	public void init() {
		FontMetrics fm;
		m_strText=this.getParameter("Text");
		fm=this.getFontMetrics(this.getFont());
		m_intTextWidth=fm.stringWidth(m_strText);
		m_intX=0-m_intTextWidth;
		m_intY=this.getSize().height/2;
	}
	
	public void paint(Graphics g) {
			g.drawString(m_strText, m_intX, m_intY);
			if (m_intX<this.getSize().width) {
				m_intX=m_intX+5;
			} else {
				m_intX=0-m_intTextWidth;
			}
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
			this.repaint();
	}
	
}
 
L

Lukas L

Gast
Ich bin nicht sicher, ob ich das verstehe. Im Beispiel mit Thread wird durch repaint() doch laufend die paint-Methode des Applets ausgeführt. Was kann ich denn anderes tun, das ohne Thread nicht möglich ist? Vielen Dank für deine Hilfe.
 

hdi

Top Contributor
Was kann ich denn anderes tun, das ohne Thread nicht möglich ist?

Naja, du kannst "etwas" anderes tun. Das geht ohne Threads nicht.

Ein Programm hat standardmässig einen Thread (lassen wir mal den Event Dispatcher und so "unsichtbare" Threads von Java weg). Dieser Thread = dein Programm startet in deiner main-Methode().

Wenn du jetzt den Ticker ohne Thread startest, ich meine das tust du ja aus irgendeinem Programm raus, die Klasse Ticker/Ticker2 sind ja keine eigenen Programme, und du willst den Ticker neu zeichnen, musst die die paint()-Methode aufrufen. Aber du willst ja, dass der Ticker sich die ganze Zeit neu zeichnet. Also musst du das die ganze Zeit machen. Es gibt dafür ja nur eine Möglichkeit:

Code:
while(true){
  ticker.paint();
}

Damit ist dein Programm zu Ende, alle Anweisungen, die danach kommen, werden nie erreicht. Das heisst du kannst dein Programm sozusagen wegwerfen, weil es nix anderes mehr tut als den Ticker hin und her zu schieben.

Wenn du eine Klasse von Thread erben lässt, packst du das, was sie tun soll, in die methode "run" und startest das mit "start()". Damit wird alles, was in dieser run-methode steht, hier also deine Endlosschleife, die zeichnet, in ein (pseudo-) paralleles Programm (=Thread) geschoben.

Und nach dem Aufruf von start aus zB deiner Main-Methode, geht es dort weiter, weil dein Programm an dieser Stelle lediglich ein Unterprogramm erstellt und ausführt, und dann normal in seinem Code weitergeht.

Ohne Thread, würde es da wie gesagt hängen bleiben. Anschaulich:



Bei der Thread-Variante wechseln sich die 2 threads, also main() und dein Ticker, die ganze Zeit ab.
Das passiert halt extrem schnell, alle paar Millisekunden. Also hast du quasi 2 Programme gleichzeitig laufen,
und kannst jetzt noch andere Sachen machen in deinem Programm, während der Ticker läuft.
zB dem Ticker im Nachhinein neue News-Infos einspeisen, oder was weiss ich was tun.
 
L

Lukas L

Gast
Zuerst vielen Dank für die ausführliche Erklärung! Dieses Forum ist super! Eine abschliessende Frage. Mit Thread läuft mein Programm also selbständig und parallel zu meinem Hauptprogramm, von wo ich den Thread starte und anschliessend weitere Dinge ausführen kann. Was mich noch immer verwirrt, ist der Bezug zum Applet. Die Ticker-Klasse ist ja ein Applet, sprich sie wird aus einer HTML-Seite heraus gestartet. Im Beispiel mit Thread erstelle ich beim Start des Applets einen Thread für meine eigene Klasse mit new Thread(this), die ja, wenn ich dich richtig verstehe, selber ein Thread ist. Habe ich jetzt zwei Threads? Einmal das Applet selber und einmal m_thread? Ich habe hier ja ausserdem kein Hauptprogramm, von wo ich den Ticker aufrufe. Das Ticker-Applet ist sozusagen das Hauptprogramm. Vielen Dank für die Hilfe!
 

Verjigorm

Top Contributor
Wenn dein Applet ausschliesslich aus dem Ticker besteht, dann kannste das Ganze ohne Thread laufen lassen.

Wenn du dagegen noch andere "Dinge" laufen lassen willst, wie z.B. irgendeine GUI mit irgendwelchen Buttons zum klicken oder sons irgendtwas, dann brauchst du einen neuen Thread, sonst hast du an der GUI keine Freude, da die ja dann blockiert, weil der "Hauptthread" mit dem Ticker beschäftigt ist und auf sonstige Eingaben (fast) nicht reagiert.
 

hdi

Top Contributor
Also mit Applets kenne ich mich nicht aus, das sag ich mal vorsichtshalber dazu, aber ich denk mal wenn man ein Applet startet wird seine start() methode aufgerufen? Das ist ja dann quasi deine main-Methode in einem normalen Java Programm. Und du brauchst:

- keinen Thread, wenn du nix weiter tun willst als das Applet initialisieren und die ganze Zeit neu malen
- einen Thread, wenn dein Applet danach noch was anderes machen soll.

Und vllt , damit du das jetzt nicht alles mit Applets verbindest, sollte man ganz generell sagen:

Sobald du eine Sache hast, die immer wieder passieren soll (while true), und du aber danach / Währenddessen noch andere Dinge mit deinem Programm/Applet vorhast, dann musst du diese Schleife in einen eigenen Thread packen, da er dir sonst den Rest blockiert.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
T Threads Neuen Thread nicht aus main-Methode starten Java Basics - Anfänger-Themen 3
P Threads Im Dialog geöffneter Thread zeichnet nicht Java Basics - Anfänger-Themen 4
J Thread interrupt funktioniert nicht Java Basics - Anfänger-Themen 5
R Threads ArrayList in Thread nicht modifizierbar? Java Basics - Anfänger-Themen 22
B Thread will nicht starten Java Basics - Anfänger-Themen 10
U Thread reagiert nicht sofort auf Tastendruck Java Basics - Anfänger-Themen 14
El_Lobo Threads bekomme Thread nicht abgewürgt mit interrupted() Java Basics - Anfänger-Themen 3
C Warum wird der Thread nicht beendet ? Java Basics - Anfänger-Themen 7
G Thread beendet nicht Java Basics - Anfänger-Themen 6
sylo Bekomme Thread nicht gleichzeitig gestartet. Java Basics - Anfänger-Themen 12
U THREAD stoppt bzw. schläft nicht!!!! Java Basics - Anfänger-Themen 12
A Trotz Thread ist Program nicht erreichbar Java Basics - Anfänger-Themen 3
T Thread tickt nicht richtig Java Basics - Anfänger-Themen 4
R Thread startet nicht, verstehe nicht warum Java Basics - Anfänger-Themen 2
G Methode nicht im Event-Dispatcher-Thread starten? Java Basics - Anfänger-Themen 2
M Simple Animation funktioniert nicht (JFrame, Canvas, Thread) Java Basics - Anfänger-Themen 6
B Thread will einfach nicht stoppen Java Basics - Anfänger-Themen 12
G nach Thread.start(); nochmal start(); aufrufen geht nicht Java Basics - Anfänger-Themen 4
W Kann Thread nicht richtig beenden. Java Basics - Anfänger-Themen 11
G Mein erster Thread funktioniert nicht. Java Basics - Anfänger-Themen 3
7 Thread will nicht stoppen Java Basics - Anfänger-Themen 2
I Thread funktioniert nicht Java Basics - Anfänger-Themen 10
8 Wieso krieg ich den Thread nicht angehalten? Java Basics - Anfänger-Themen 2
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben