Thread.sleep pausiert das ganze Programm

conehead

Mitglied
Hi.
Ich versuch mich einmal kurz zu fassen und das ganze (fast) ohne Quelltext zu erklären, da es mittlerweile etwas mehr geworden ist.

Ich habe ein Programm welches 2 Thread startet.
Der erste Thread ruft ständig repaint() auf, damit ein Panel, indem ich scrollen und ranzoomen kann usw ständig aktuell gehalten wird.
Ein zweiter Thread soll alle x sekunden eine Funktion aufrufen.

Das funktioniert soweit noch ganz gut.
Jetzt habe ich dem zweiten Thread noch eine Funktion hinzugefügt, die man wahlweise starten kann.
Nur wenn ich hier ein sleep() mit einbaue, dann bleibt bei diesem sleep das ganze Programm stehen.

DARF man keine extra Funktionen zu einem Thread hinzufügen?
Java:
	public void run(){
		while(true){
			sa.callNextStep();
			try {
				sleep(waitTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
Das funktioniert. Er zeichnet die ganze Zeit durch und ruft alle paar Sekunden die Funktion auf.

Java:
public void runSteps(int steps){
		for(int i=0;i<steps;i++){
			sa.callNextStep();
			try {
				sleep(waitTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
Diese Funktion funktioniert nicht mehr. Bei diesem sleep() steht das gesamte Programm.

Sinn der sache ist, dass ich eine Simulation schreibe und generell soll er alle x sekunden den nächsten Schritt aufrufen. Aber ich möchte die Simulation auch pasieren können und beispielsweise 5 Schritte manuell ausführen. Dafür ist die extra Funktion.

Irgendwelche Vorschläge, woran es liegen kann?
 
ein Thread ist keine Spassveranstaltung sondern hat ein begrenztes aber doch unumgängliches Konzept:
gestartet wird mit start(), nebenläufig ausgeführt wird dann run(),
alles was der Thread nebenläufig machen soll, muss aus run() heraus ausgeführt werden,
andere Methoden können gerne definiert werden, es können auch sämtliche anderen Klassen des Programms und der API beteiligt sein,
solange alles seinen Ursprung in run() hat, von dort aus aufgerufen wird

die Methode runSteps() rufst du doch sichern von wer weiß wo einfach so auf?
dann ist halt die Nebenläufigkeit-Funktion nicht vorhanden,
genauso übrigens beim beliebten Fehler, run() selber aufzurufen, auch dann ist es ein normaler Methodenaufruf, keine Nebenläufigkeit,
an einem Thread darf man in erster Linie nur start() aufrufen, per Magie kommt dann auch run() dran und run() kümmert sich um alles, fertig
 
Was wäre denn dann "schön" programmiert?
Ich habe einen SchedulerAgent, der den Thread startet.
Die Gui sorgt im moment per Knopfdruck dafür, dass der SchedulerAgent die Aktion im Thread ausführt.

Sollte ich eine Variable im Thread deklarieren und diese zB auf 20 Steps setzen und dann run() aufrufen, welche die 20 Schritte ausführt und diese Variable dann = 0 setzt?
 
'run() aufrufen' klingt schon wieder verdächtig, start() aufrufen meinst du sicherlich,

eine Variable vor dem Start zu setzen ist eine gute Idee, ja,
für solche Aktionen, die nur Nanosekunden lang dauern ist es auch vollkommen in Ordnung, Methoden am Thread-Objekt aufzurufen, wie an jedem anderen Objekt auch

ein Thread kann letztlich auch während seiner Laufzeit gesteuert werden, z.B. macht dieser mit einer Endlosschleife ständig x ms Pause,
und wenn er mal kurz aus seinem Schlaf erwacht, prüft er die Datenlage, z.B. eine Warteschlange an Aufträgen und arbeitet ab was zu tun ist

ganz so wie gewisse Menschen in ihren Büros 😉
 
Zuletzt bearbeitet von einem Moderator:
Okay vielen Danke!
Jetzt läuft es.
Mal kurz wie ich es geregelt habe:
Ein boolean isPaused hinzugefügt und ein int, wie viele Steps noch gemacht werden sollen.
Wenn die Simulation pausiert ist, wird geprüft, ob Steps gemacht werden sollen.
Wenn ja, dann läuft er diese durch und setzt die Variable = 0.

So habe ich wirklich nur mein thread.start() und rufe diese Funktion extern nicht erneut auf.
 

Zurück
Oben