Java Thread Probleme, bzw Verständnisproblem?

Bender86

Lieutenant
Registriert
Jan. 2007
Beiträge
707
Moin zusammen!

Da bei mir nächstes Semester ein Software-Projekt ansteht, versuche ich mich grade ein bisschen in Threads und das Model/Observer Prinzip einzuarbeiten. Mein Ziel ist im Moment folgendes:

- Es gibt eine Klasse "Init", die ein kleines Programm darstellt das..
- Einen "ServerThread" erzeugt und startet, der später einmal einen Port belegen soll, auf Clients horchen, was ein Server so macht...
- Der "ServerThread" startet im Kontruktor einen "CommandThread". Letzterer soll Konsoleneingaben vom Benutzer entgegen nehmen und wenn eine gemacht wurde mittel "notifyObservers()" den ServerThread benachichtigen, damit dieser auf den entsprechenden Befehl reagieren kann. Der ServerThread wird natürlich auch als Observer eingetragen.

Hier mal schemahaft wie die Threads gestartet werden:

Code:
package server;

public class Init {

	public static void main(String[] args) {

		ServerThread st = new ServerThread();
		st.run();

	}

}

public class ServerThread implements Runnable, Observer {
	
	CommandThread cmdT;
	
	ServerThread() {
		cmdT = new CommandThread();
		cmdT.addObserver(this);
		cmdT.run();
	}
	
	run() {
		// Blabla
	}
	
	update() {
		
	}
}

public class CommandThread extends Observable implements Runnable () {
	
	run() {
		// Blabla
	}
	
}

Bei Bedarf kann ich auch den kompletten Code posten. Durch Testausgaben stelle ich fest, dass der CommandThread gestartet wird, der ServerThread aber scheinbar nicht. Wenn ich Testeingaben mache werden die Observer auch benachichtigt, aber die update() Methode vom ServerThread nicht aufgerufen.

Also so wie ich mir das vorstelle müsste doch der CommandThread gestartet werden und auch unmittelbar danach auch der ServerThread oder nicht?

Ich hoffe hier kann mir jemand sagen wesshalb das so nicht funktioniert.
 
Wenn du cmdT.run() aufrufst, wartet er an der Stelle unendlich, denn die run-Methode des CommandThreads läuft eben nunmal unendlich (nehme ich mal an, sonst würde das ja nicht funktionieren). Vielmehr musst du es folgendermaßen machen:
Code:
Thread myThread = new Thread (cmdT); 
myThread.start();

Die Bezeichnung deiner Klassen als Thread ist im Übrigen eigtl. ungünstig gewählt, da es ja Runnables und eben keine Threads sind.

Eclipse hat eine sehr gute Debugfunktion eingebaut, mit der man solche Fehler sehr gut eingrenzen kann. Insbesondere wenn du was Größeres baust, solltest du das mal besser jetzt gleich anschauen. Außerdem sollten die Variablenbezeichnungen besser gewählt sein (st und cmT sind viel zu kurz und unaussagekräftig). Hierzu könntest du dir mal die Coding-Conventions von Java anschauen: http://java.sun.com/docs/codeconv/
 
Zuletzt bearbeitet:
Die Variablennamen habe ich jetzt nur kurz gewählt da das nur ein Ausschnitt ist. Und das Programm soll auch nicht unbedingt etwas fertiges werden, ich mache das ja nur zum üben.

Aber auch ein runnable wird doch letztlich zu einem Thread im Prozess der Paralell zu den anderen Threads läuft oder nicht? Genau das wundert mich ja.. müsste nicht bei run() ein Thread gestartet werden und der Rest vom Programmcode wird weiter abgearbeitet?

Aus der Sun Klassenbibliothek:

The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. The class must define a method of no arguments called run.

This interface is designed to provide a common protocol for objects that wish to execute code while they are active. For example, Runnable is implemented by class Thread. Being active simply means that a thread has been started and has not yet been stopped.
 
Nein, der Aufruf der run-Methode erzeugt KEINEN Thread. Du musst schon genau lesen. "The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread." D.h. die Runnable-Klasse wird durch einen Thread ausgeführt und eben deshalb musst dus so schreiben wie in meinem vorigen Post.

Die Thread-Klasse hat praktisch einen Konstruktor, der Runnables annimmt. Wenn du ihr kein anderes Runnable gibst oder die Klasse Thread eben entsprechend erweiterst, so stellt die Thread-Klasse einfach selbst das Runnable dar (daher wird auch das Runnable-Interface implementiert). Durch das Aufrufen von start() in der Thread-Klasse wird die run-Methode des entsprechend aktiven Runnable aufgerufen.

Die Vorgehensweise solltest du auch in jedem Javabuch (z.B. "Java ist auch eine Insel" welches es online gibt) finden.
 
Aaaahaaa! Ok hab das mal so gemacht und nun laufen auch tatsächlich Threads. Danke für die Hilfe!
 

Ähnliche Themen

Zurück
Oben