Threads Programm terminiert statt zu warten

Shadoka

Mitglied
Hallo und guten Morgen,

mein Problem ist, dass ich einen Thread eine bestimmte Zeit warten lassen möchte, nur terminiert das Programm an der Stelle, wo ich wait(long wait) aufrufe. Und das ohne Fehlermeldung.
Hier der Code:

Java:
	@Override
	public void run() {
		long wait;
		while (true) {
			wait = this.getWaitingTime();
			this.waitWithTime(wait);
			this.changeState();
		}
	}

	private synchronized void waitWithTime(long wait) {
		try {
			this.wait(wait);
		} catch (InterruptedException e) {
		}
	}

Die Methode getWaitingTime() liefert eine zufällige Zahl 0 < x <= 5000

Sieht vielleicht jemand einen Fehler?

Grüße,

Shadoka
 

Shadoka

Mitglied
Java:
public class Philosopher implements Runnable {

	private State state;

	private Philosopher() {
		System.out.println("Wurde als denkend initialisiert");
		this.state = ThinkingState.create(this);
	}

	public static Philosopher create() {
		return new Philosopher();
	}

	@Override
	public void run() {
		long wait;
		while (true) {
			wait = this.getWaitingTime();
			this.waitWithTime(wait);
			this.changeState();
		}
	}

	private synchronized void waitWithTime(long wait) {
		try {
			System.out.println("davor");
			System.out.println(wait);
			Thread.sleep(wait);
			System.out.println("danach");
		} catch (InterruptedException e) {
			System.out.println("bin ich hier?");
		}
	}

	public void start() {
		Thread thread = new Thread(this);
		thread.start();
	}

	private long getWaitingTime() {
		Random rnd = new Random();
		long wait = rnd.nextLong() % 5000 + 1;
		if (wait <= 0) {
			wait = wait * -1 + 1;
		}
		return wait;
	}

	private void changeState() {
		this.setState(this.getState().accept(new StateVisitor() {

			@Override
			public State visit(EatingState state) {
				System.out.println("Wechsle in: denkend");
				return ThinkingState.create(Philosopher.this);
			}

			@Override
			public State visit(ThinkingState state) {
				System.out.println("Wechsle in: essend");
				return EatingState.create(Philosopher.this);
			}

		}));
	}

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}
}

Das ist die komplette Klasse. Damit soll einfach erreicht werden, dass ein Philosoph nach zufälliger Zeit seinen Zustand wechselt.

€: Die System.out.printlns habe ich nur gesetzt um zu sehen, wo der Hase im Pfeffer liegt.
 

Jango

Gesperrter Benutzer
Ich bin mit Java auch nicht mehr soo fit, aber du kannst auch

Java:
 Thread.sleep(2000);

schreiben.

Arr... Ich muss mich mal wieder mit Java beschäftigen.
 

Kevin94

Top Contributor
Es wartet schon, der Problem ist wohl, dass in beiden Fällen die zeit in Millisekunden angegeben wird und du 100 ms eben schlecht wahrnehmen kannst. Ich nehme mal an, dass es einem erst bei mehr als 2s wirklich auffällt, dass pausiert wird. Probier doch mal folgenden Code für wait aus:
Java:
try {
System.out.println("davor");
System.out.println("Soll:"+wait);
long before=System.nanoTime();
Thread.sleep(wait);
long slept=System.nanoTime()-before;
System.out.println("danach");
System.out.println("Ist:"+slept*1e-6);// Umrechnen von ns in ms
} catch (InterruptedException e) {
System.out.println("bin ich hier?");
}

Theoretisch müsste wait in etwa slept entsprechen (plus minus etwa 10 ms), wenn das nicht der Fall ist, dann hast du ein ernsthaftes Problem mit deiner Java-Installation.
 

Shadoka

Mitglied
Ich hab das mal in deine Version umgeändert, dies kommt in der Konsole:
Code:
Wurde als denkend initialisiert
davor
Soll:952

Auch wenn ich eine Wartezeit von 4000ms habe ändert sich nichts daran. Es ist wirklich so, als ob das Programm an der Stelle wo ich Thread.sleep() aufrufe, terminiert.
 

Kevin94

Top Contributor
Ist es so als ob es terminiert oder terminiert es wirklich. Also beendet es wirlich oder läuft es ewig weiter ohne eine weitere Ausgabe?

Am sleep kann es nicht liegen, das funktioniert so wie es ist, also muss das Problem irgendwo anders stecken, vielleicht im synchronized (das brauchst du bei sleep nicht). Ich hab keinen blassen Dunst, nach meinem Kenntnisstand gibt es keine Möglichkeit, dass nicht entweder eine Exception oder die Ist ausgabe in der Console kommt. Das einzige was mir einfallen würde ist ein Deadlock, ich kann mir aber nicht vorstellen, wie der während des sleeps zustande kommen soll. Wenn es einer wäre dürfte er nicht auftreten, wenn man das synchronized bei der Methode entfernt.
 

Shadoka

Mitglied
@Jango: Auch damit funktioniert es nicht, aber in der Funktion wird ja auch wieder dieselbe Thread.sleep() aufgerufen.

@Kevin94: Es terminiert wirklich, deswegen kann es auch nicht in einem Deadlock hängen...es ändert sich auch nichts, wenn ich das synchronized entferne.

Ich habe mir auch Beispiele aus dem Internet angesehen, aber ich kann da wirklich nicht erkennen, woran es bei mir liegen könnte...
 

Kevin94

Top Contributor
Ich nehme mal an, dass es keine weiteren Ausgaben gibt (Exceptions), du nirgendwo System.exit aufrufst und auch nirgendwo Code hast, der Exceptions verschluckt. Wenn all dies zutrifft, bin ich ratlos. Was passiert wenn du das ganze drumherum weglässt und nur in ner Testklasse die wait methode ausführst?
 
T

trääät

Gast
also terminierung durch Thread.sleep() klingt schon ziemlich komisch ... zugegeben ... aber wie die ausgabe zeigt steigt das programm ja nun mal an genau der zeile wirklich aus ...
allerdings würde ich hier eher noch anderen code vermuten der drum herum abläuft aber nicht gepostet wurde ...
ansonsten hat deine java-install , dein os oder möglicherweise sogar deine hardware einen ziemlich heftigen schaden ...

versuche das problem mal auf ein compile-bares minimal-beispiel zu reduzieren ... denn so kann man es leider nicht selbst testen ...
 

Shadoka

Mitglied
Dies hier macht er ohne Probleme:

Java:
public class TestThreads {

	public void waitSomeTime(long time) {
		try {
			Thread.sleep(time);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		TestThreads test = new TestThreads();
		test.waitSomeTime(10000);
	}
}

Ich scheine da ein interessantes Problem zu haben...
 

Kevin94

Top Contributor
Ich hatte nichts anderes erwartet. Das Problem muss irgenwo im restlichen Code stecken. Hast du bisher immer nur einen Thread gestartet?
Poste doch mal den noch nicht geposteten Code.
 
T

trääät

Gast
dann dürfte außerhalb irgendwas passieren was du nicht gepostet hast ... denn ich vermute der fehler steckt nicht im gepostetem sondern in irgendwas anderem was noch außen drumrum liegt ...
 

florilu

Aktives Mitglied
In einem meiner Programme habe ich es folgendermaßen gemacht, damit du nicht in Millisekunden rechnen musst ^^

Java:
static void sleep(int par1)
	{
		par1 = (par1 * 1000);
		try
		{
			Thread.sleep(par1);
		}catch(InterruptedException e){
			
		}
	}
Dann das Sleep iwo einfügen und dann z.B. "sleep(1)" eingeben damit er eine Sekunde "schläft".
Hoffe es kann dir weiterhelfen ;) Auch wenn es sogesehen gelöst ist.

MfG:
Florilu
 

Kevin94

Top Contributor
Ich bin mir zwar nicht sicher, ob es daran liegt, aber es ist das einzige was mir auffällt: Teste doch mal damit:

Java:
package test;

import philosopher.Philosopher;

public class TestPhilosophers {

public static void main(String[] args) {
Philosopher phil1=Philosoher.create();
phil1.start();
System.out.println("main beendet").
}
}

Wenn ich es mir recht überlege ist sogar ziemlich logich, das JUnit, nachdem alle Test abgeschlossen sind, die VM "hart" mit System.exit beendet.
 

Shadoka

Mitglied
Wow, danke!

Daran liegt es tatsächlich, was mich allerdings ein kleines bisschen wundert. In meinem kleinen Testprogramm oben lief es sowohl in der main()-Methode als auch unter Junit, deswegen hatte ich ausgeschlossen, dass es etwas damit zu tun haben kann.

Danke nochmal, jetzt kann ich endlich mit der eigentlichen Aufgabe anfangen :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Input/Output Programm terminiert nicht -> stürzt ab, wo Fehler? Java Basics - Anfänger-Themen 3
N Warum terminiert mein Programm nicht? Java Basics - Anfänger-Themen 13
O Warum terminiert mein Programm nicht!? Java Basics - Anfänger-Themen 15
A Wieso terminiert das Programm nicht? Java Basics - Anfänger-Themen 4
S Programm terminiert nicht Java Basics - Anfänger-Themen 2
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
M Java Mail Programm Java Basics - Anfänger-Themen 4
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
M Mini Jar-Programm Java Basics - Anfänger-Themen 51
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
M Das Programm stellt nichts dar Java Basics - Anfänger-Themen 2
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
Z Programm Ideen Java Basics - Anfänger-Themen 8
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
T Programm stürzt ab Java Basics - Anfänger-Themen 40
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
Jul1n4tor Programm mit Scanner und If-Statements Java Basics - Anfänger-Themen 2
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
K Ist das Programm schlecht bzw. schlampig programmiert ? Java Basics - Anfänger-Themen 9
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
nbergmann IntelliJ: Wie lade ich ein fertiges Programm aus dem Lehrbuch? Java Basics - Anfänger-Themen 26
D Anfängerfrage zu meinem Programm. Java Basics - Anfänger-Themen 15
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Kydo Programm Beschreibung Java Basics - Anfänger-Themen 3
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7
T Java FXML selbes Fenster verschiedene Stellen im Programm Java Basics - Anfänger-Themen 5
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
D JAVA Programm schreiben Java Basics - Anfänger-Themen 46
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Wo hält das Programm an? Java Basics - Anfänger-Themen 11
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
Fugover Kopfrechnen-Programm Java Basics - Anfänger-Themen 6
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
J selbst erstellte Datei mit Programm öffnen Java Basics - Anfänger-Themen 10
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
A wie kann ich es in meinem Programm rein tun Java Basics - Anfänger-Themen 8
S Fehler beim Programm Java Basics - Anfänger-Themen 2
Jose05 Fehler im Programm feststellen Java Basics - Anfänger-Themen 2
F Kann mir jemand kurz dieses Programm erklären? Java Basics - Anfänger-Themen 22
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
A Lotto Programm Java Basics - Anfänger-Themen 3
S Programm erstellen Java Basics - Anfänger-Themen 3
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
S MinMax Programm erstellen Java Basics - Anfänger-Themen 4
J Interpreter-Fehler Programm gibt nicht gewünschtes Ergebnis aus Java Basics - Anfänger-Themen 11
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
B Java Programm soll mit Python kommunizeren Java Basics - Anfänger-Themen 1
SpigBin Programm läuft nicht weiter... Java Basics - Anfänger-Themen 10
M JAVA Programm in Website einbinden Java Basics - Anfänger-Themen 19
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
B Programm beendet sich nicht und weiteres seltsames Verhalten Java Basics - Anfänger-Themen 9
N Eclipse Programm normal ausführen Java Basics - Anfänger-Themen 1
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
WAB9703-04 Programm zum automatischen Ausfüllen von Formularen programmieren Java Basics - Anfänger-Themen 3
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
G Programm Code Java Basics - Anfänger-Themen 5
CptK Achsenskalierung in Koordinatensystem hängt Programm auf Java Basics - Anfänger-Themen 5
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
Sajeel Chattha Dieses Programm umschreiben Java Basics - Anfänger-Themen 5
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
A Programm Histogram Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
CT9288 Interaktion mit laufendem Programm -Fachbegriffe Java Basics - Anfänger-Themen 2
Gaudimagspam Assertions im Programm hinzufügen Java Basics - Anfänger-Themen 4
G Weiß jemand wie man dieses Programm schreibt? Java Basics - Anfänger-Themen 84
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
W Programm dass Palindrome erkennt Java Basics - Anfänger-Themen 6
K Erste Schritte Programm geht aus Schleife, warum? Java Basics - Anfänger-Themen 2
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
M Rekursives Programm zum Anzeigen von Primzahlen Java Basics - Anfänger-Themen 3
X Kurzes Java-Programm, das sich komisch verhält Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben