Threads Timer

eLwoodianer

Mitglied
Hallo zusammen,

Ich sitze gerade an einer Programmieraufgabe und bin mir bei der Realisierung eines Timers unsicher.

Aufgabenstellung:
Gegeben sei ein Ringpuffer, […] besitzt die Methoden put und get, um einen Wert im Puffer abzulegen bzw. aus dem Puffer auszulesen. put und get können von verschiedenen Threads aufgerufen werden. Der Zugriff auf den gemeinsamen Puffer ist ein kritischer Bereich. […] Schreiben Sie ein Testprogramm, mit 3 Erzeuger‐ und 2 Verbraucher‐Threads, die unterschiedlich schnell sind. Die Erzeuger‐Threads schreiben Zufallszahlen […] die Verbraucher‐ Threads holen Werte aus dem Puffer und geben sie auf dem Bildschirm aus. Das Programm soll nach einer vorgegebenen Zeit terminieren. Dazu benötigen Sie einen Timer‐Thread. Sobald die Laufzeit – in Minuten – eingestellt ist, läuft die Zeit quasi rückwärts. Nach Ablauf der Zeit müssen die noch aktiven Erzeuger‐ und Verbraucher‐Threads sicher beendet werden.


Folgende Lösungsansätze sind mir dazu eingefallen:
  • Man startet einfach einen Thread, lässt ihn die angegebene Zeit "schlafen" und wartet im Hauptprogramm bis er fertig ist um anschließend alle Erzeuger und Verbraucher zu unterbrechen.
  • Man könnte aber auch einem Timer-Thread starten. Ihm den Auftrag geben nach der angegeben Zeit ein TimerTask auszuführen, in dem alle Threads unterbrochen werden. Der Klasse InterruptThreads (extends TimerTask) könnte man im Konstruktor die zu unterbrechenden Threads als Array übergeben. (Um es flexibel zu gestalten.)

Meine Erfahrung mit Timern geht gegen Null. Deshalb meine Frage: Was für ein Lösungsansatz bietet sich an, gibt es vielleicht noch andere Herangehensweisen?

Viele Dank
eL
 

tagedieb

Top Contributor
Meine Lösungsvorschlag ist den Timer zu verwenden. Es macht keinen Sinn das selber zu implementieren.
Der Timertask sollte aber die Threads nicht selber beenden sondern nur ein Flag (boolan running) setzen und die Consumer- und Providerthreads prüfen regelmässig auf dieses Flag. (Einen Thread mit interrupt zu beenden ist alles andere als sicher).

Als Basis für den Ringpuffer würd ich eine BlockingQueue empfehlen, damit kannst du dir die ganze synchronization sparen. Ausserdem kannst du zum Auslesen die Methode
Code:
poll(time, unit)
verwenden, damit der Thread nicht ewigs wartet.
 

eLwoodianer

Mitglied
Ich versteh nicht ganz, was du mit "(Einen Thread mit interrupt zu beenden ist alles andere als sicher)" meinst.
Ich dachte an folgendes Prinzip... Im Hauptprogramm:
Code:
Thread producer1 = new Thread(ProducerJob);
, in einer von TimerTask abgeleitetet Klasse:
Code:
producer1.interrupt;
und in der Klasse ProducerJob:
Code:
 run { while(!isInterrupted) { ... } }

Das ist doch gänige Praxis und sicher ... oder täusch ich mich da ???:L

Das mit der BlockingQueue ist gut zu wissen, allerdings in diesem Fall nicht gewünscht, da wir uns mit der Synchronisation auseinander setzen sollen.

eL
 

tagedieb

Top Contributor
Ich versteh nicht ganz, was du mit "(Einen Thread mit interrupt zu beenden ist alles andere als sicher)" meinst.
Ich dachte an folgendes Prinzip... Im Hauptprogramm:
Code:
Thread producer1 = new Thread(ProducerJob);
, in einer von TimerTask abgeleitetet Klasse:
Code:
producer1.interrupt;
und in der Klasse ProducerJob:
Code:
 run { while(!isInterrupted) { ... } }

Das ist doch gänige Praxis und sicher ... oder täusch ich mich da ???:L

Das mit der BlockingQueue ist gut zu wissen, allerdings in diesem Fall nicht gewünscht, da wir uns mit der Synchronisation auseinander setzen sollen.

eL

Nein, dies ist weder gängige Praxis noch sicher.

Interrupt killt sozusagen den Thread. Dies ist nicht gerade als sicher zu bezeichnen.
Ein Thread beendet sich sicher, wenn er das Ende der
Code:
run()
Methode erreicht.


Dies kann man z.B. via Flag erreichen. In jedem durchgang wird der Flag geprueft und falls 'false' die Methode beendet. Von aussen kann man dann via
Code:
thread.setRunning(false)
den Thread stoppen.
Java:
boolean running = true;
public void run() {
    while(running) {
        ...
    }
}

public voic setRunning(boolean running) {
    this.running = running;
}


Code:
thread.interrupt()
sollte man nur in Ausnahmesituationen benutzen, da Exceptions nicht zur Applikationslogik gehören sondern Ausnahmen behandeln. Wenn du aber mit synchronized arbeiten musst solltest du die
Code:
wait(long timeout)
verwenden, damit die Threads nicht endlos blockieren (genau dafür braucht man nämlich dann interrupt())
 

eLwoodianer

Mitglied
[...] Durch Aufruf von
Code:
interrupt
wird ein Flag gesetzt, das eine Unterbrechungsanforderung signalisiert. Durch Aufruf von
Code:
isInterrupted
kann der Thread feststellen, ob das Abbruchflag gesetzt wurde [...]

Entweder steh ich auf dem Schlauch oder deine Aussage passt nicht zu der Aussage im Buch. Weiter steht dort auch, dass die beiden Methoden dafür da sind um genau das zu machen was du in deinem Beispiel beschreibst.

Ich hab das gerade mit
Code:
run { while(!isInterrupted) { ... } }
getestet und der Thread läuft sauber bis zum Ende der run()-Methode durch, nachdem er mit Thread.interrupt() unterbrochen wurde.
 

tagedieb

Top Contributor
Gratuliere, dann hast du das Ziel erreicht!!

Programierung ist zum Teil auch Geschmacksache. Auch die Leute von (Sun/Java) sind nicht ueber alle Zweifel erhaben und koennen umstrittene Loesungen entwickeln.

Das gleiche gilt fuer Professoren, welche Buecher scheiben. Inhaltlich zwar korrekt, aber das heist nicht, dass man die auch in der Praxis verwenden sollte. Viele von Ihnen schaffen es auch nach Jahren nicht sich in ihren Beispielen an die Java Namingconventions zu halten
 

eLwoodianer

Mitglied
Ich denk ich hab verstanden auf was du hinaus willst und auch die Problematik mit
Code:
interrupt()
. Wieder was gelernt heute. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
E multiple Timer die sich nicht summieren Java Basics - Anfänger-Themen 12
Jan_x8 Timer/Scanner Java Basics - Anfänger-Themen 5
C Timer aktualisieren Java Basics - Anfänger-Themen 5
L GUI- wie cancel ich einen Timer? Java Basics - Anfänger-Themen 10
missy72 Timer oder Timeline Java Basics - Anfänger-Themen 3
R Timer Format: 00:00:00 Java Basics - Anfänger-Themen 29
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
D Änder der Timer Speeds Java Basics - Anfänger-Themen 1
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
L Methoden Timer Java Basics - Anfänger-Themen 9
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
G Animation Timer Nano Time Java Basics - Anfänger-Themen 2
S Timer reseten Java Basics - Anfänger-Themen 3
T Timer stoppt zu früh Java Basics - Anfänger-Themen 7
CptK Methoden Timer & Mathematischer Denkfehler Java Basics - Anfänger-Themen 7
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
D Timer programmieren Java Basics - Anfänger-Themen 13
N Timer funktioniert nicht beim starten Java Basics - Anfänger-Themen 3
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
J Timer richtig pausieren Java Basics - Anfänger-Themen 2
E Timer erstellen Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
S actionlistener timer Java Basics - Anfänger-Themen 9
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
S timer mit imagedatei Java Basics - Anfänger-Themen 5
S timer Java Basics - Anfänger-Themen 0
V Java Uitil Timer Stoppt nicht Java Basics - Anfänger-Themen 2
KaffeeFan Timer beenden Java Basics - Anfänger-Themen 12
K Ampelsteuerung mit Timer Java Basics - Anfänger-Themen 8
F Array und Timer Java Basics - Anfänger-Themen 2
G Timer einsetzen Java Basics - Anfänger-Themen 2
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
T Timer - HILFE Java Basics - Anfänger-Themen 10
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Schneller Timer Java Basics - Anfänger-Themen 2
C Timer aus anderer Klasse stoppen/starten Java Basics - Anfänger-Themen 3
B Timer beenden? Java Basics - Anfänger-Themen 0
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
O Delayed Timer erstellen Java Basics - Anfänger-Themen 3
M Timer / Thread Java Basics - Anfänger-Themen 43
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
A Timer: textarea.getText() mit Variable vergleichen Java Basics - Anfänger-Themen 3
D Problem mit Methode und Timer Java Basics - Anfänger-Themen 35
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
R Einfacher Timer geht nicht Java Basics - Anfänger-Themen 7
J Swing Timer Java Basics - Anfänger-Themen 3
M Einfacher Timer ;) Java Basics - Anfänger-Themen 15
M Timer für Termial-Eingaben Java Basics - Anfänger-Themen 3
C Methoden Einen Timer einbauen, aber wie? Java Basics - Anfänger-Themen 5
B Timer Java Basics - Anfänger-Themen 25
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
S Timer / Schleifen Verständnis Problem Java Basics - Anfänger-Themen 3
S Erste Schritte Java Timer Java Basics - Anfänger-Themen 13
Spin KI Anfänger Frage : Timer Problem Java Basics - Anfänger-Themen 6
F Prüfen ob timer läuft Java Basics - Anfänger-Themen 6
L Erste Schritte Timer und Zugriffsattribute Java Basics - Anfänger-Themen 5
M Audio + Timer Java Basics - Anfänger-Themen 12
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
R Klassen MemorySpiel: brauche Timer Java Basics - Anfänger-Themen 3
D Timer in Applet Java Basics - Anfänger-Themen 2
ruerob Warum ist Timer schneller als While? Java Basics - Anfänger-Themen 9
F Java Timer Frage Java Basics - Anfänger-Themen 14
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
B Timer Java Basics - Anfänger-Themen 2
S timer task problem Java Basics - Anfänger-Themen 2
C Überprüfen, ob Timer läuft Java Basics - Anfänger-Themen 3
S "Kleines" Problem mit dem Timer Java Basics - Anfänger-Themen 4
Luk10 Problem mit vielen Timer(-Events) Java Basics - Anfänger-Themen 17
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
W Timer erstellen Java Basics - Anfänger-Themen 2
M Timer: period während Verlauf wechseln Java Basics - Anfänger-Themen 12
M Timer unterbrechen? Wo ist mein Thread? Java Basics - Anfänger-Themen 2
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
P Java Timer Java Basics - Anfänger-Themen 2
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
B problem mit timer/timertask, Farbverlauf Java Basics - Anfänger-Themen 10
Piwi Timer bei Programmende beenden Java Basics - Anfänger-Themen 25
T zweiter Timer überschreibt den ersten Timer ? Java Basics - Anfänger-Themen 5
kulturfenster Problem mit javax.swing.Timer Java Basics - Anfänger-Themen 2
C Regelmäßigen Timer bei Zeitüberschreitung nacheinander abarbeiten Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
H Timer Java Basics - Anfänger-Themen 3
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
G Klasse mit Timer nicht beenden Java Basics - Anfänger-Themen 6
S Timer / TimerTask Frage Java Basics - Anfänger-Themen 8
S Timer bzw. TimerTask Frage Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben