Timer / TimerTask Frage

Status
Nicht offen für weitere Antworten.

skywalker

Aktives Mitglied
hallo,

wenn ich einen TimerTask mit einem sehr sehr kleinen intial delay aufruf - z.B. 1 millisekunde kommt es (nicht regelmäßig) vor das im Task der if-Zweig nicht ausgeführt wird.

Code:
public class SimpleBroadcastServer extends Node  {

  ArrayList<Connector> connectorList = new ArrayList<Connector>();
  Clock clock = new Clock();
  Message msg = new Message();
  Timer timer;  
  /**
   * @param seconds is the period time in seconds between successive task executions
   */
  public SimpleBroadcastServer(int seconds) {
    timer = new Timer();
    timer.scheduleAtFixedRate( new BroadcastTask(),
        1,          // initial delay in milliseconds
        seconds * 1000); // subsequent rate in seconds 
    //(converts milliseconds in seconds)     
  }
  public void connect(Connector connector) {
    connectorList.add(connector);
  }
  /**
   *  broadcastTime is used by class BroadcastTask
   *  creates a new message and new clock
   *  sets message time on current time
   *  sends generated message to the connectors in the connectorList
   */
  public void broadcastTime() { 
    for(Connector connector: connectorList) {
      msg.setTime(clock.getCurrentTime());
      System.out.println("server sends broadcast\t\t\t\t\t\t "+msg.getMessageContent());//test output
      connector.send(this, msg);          
     
    }
  }
  /**
   * send respond to the client request
   */
  public void send(Connector connectorFrom, Message msg){
    Message respondMsg = new Message();
    Clock clock = new Clock();
    respondMsg.setTime(clock.getCurrentTime());
    connectorFrom.send(this, respondMsg);
    System.out.println("server got client request and responds with  \t\t\t " 
                       + respondMsg.getMessageContent());//test output
  }
  /**
   * BroadcastTask sends broadcastTime() at regular intervals  
   */
  class BroadcastTask extends TimerTask {

    int numberMessages = 1;//defines how many messages will be sent    

    public void run() {      
      if (numberMessages > 0) {
        broadcastTime();              //DIESER TEIL WIRD "VERSCHLUCKT"
        numberMessages--;
      } else {  
        System.out.println("messages transmitted");
        timer.cancel();             
      }
    }
  }  
}

hat wer eine idee warum bzw. gibts dafür eine erklärung?

greetz, alex.
 

skywalker

Aktives Mitglied
mit synchronized wird der if-zweig nahezu immer "geschluckt" - also nicht ausgeführt.

manchmal bekomm ich auch folgende fehlermeldung:
Code:
Exception in thread "Timer-0" java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
	at java.util.AbstractList$Itr.next(Unknown Source)
	at org.trade.tsframework.core.SimpleBroadcastServer.broadcastTime(SimpleBroadcastServer.java:38)
	at org.trade.tsframework.core.SimpleBroadcastServer$BroadcastTask.run(SimpleBroadcastServer.java:65)
	at java.util.TimerThread.mainLoop(Unknown Source)
	at java.util.TimerThread.run(Unknown Source)
 

didjitalist

Bekanntes Mitglied
dein task wird durch den aufruf von scheduleAtFixedRate jede sekunde aufgerufen. wenn broadcastTime() jetzt länger als eine sekunde braucht, wird dein timer mehrmals aufgerufen. der nicht synchronisierte zugriff auf das feld numberMessages kann dann dafür sorgen, dass in dem feld nicht steht, was du erwartest. ein int kann zwar iirc atomar auf einen neuen wert gesetzt werden, die subtraktion ist aber keine atomare aktion.

dazu kommt das problem, dass die methode connect die liste connectorList modifziert, die zeitgleich in der methode broadcastTime durchiteriert wird (ConcurrentModificationException).

weiterhin wird in der methode broadcastTime das feld msg modifziert, ohne synchronisiert zu werden. das kann auch zu ungewollten zuständen führen.

kurz gesagt, dein nebenläufiges system ist nicht thread safe und verhält sich daher fehlerhaft.
 

skywalker

Aktives Mitglied
ok - das mit dem letzten satz hab ich mir auch so gedacht.

aus den vorigen sätzten lern ich einiges - nur wie bieg ich das ganze mit timer / timer task so hin das es thread safe ist?
 

didjitalist

Bekanntes Mitglied
Code:
public class SimpleBroadcastServer extends Node  { 

	  private ArrayList<Connector> connectorList = new ArrayList<Connector>(); 
	  private Clock clock = new Clock(); 
	  private Message msg = new Message(); 
	  private Timer timer;  
	  /** 
	   * @param seconds is the period time in seconds between successive task executions 
	   */ 
	  public SimpleBroadcastServer(int seconds) { 
	    timer = new Timer(); 
	    timer.scheduleAtFixedRate( new BroadcastTask(), 
	        1,          // initial delay in milliseconds 
	        seconds * 1000); // subsequent rate in seconds 
	    //(converts milliseconds in seconds)      
	  } 
	  public void connect(Connector connector) { 
		  synchronized( connectorList )
		  {
			  connectorList.add(connector);
		  }
	  } 
	  /** 
	   *  broadcastTime is used by class BroadcastTask 
	   *  creates a new message and new clock 
	   *  sets message time on current time 
	   *  sends generated message to the connectors in the connectorList 
	   */ 
	  public void broadcastTime() {
		  synchronized( connectorList )
		  {
		    for(Connector connector: connectorList) { 
		      msg.setTime(clock.getCurrentTime()); 
		      System.out.println("server sends broadcast\t\t\t\t\t\t "+msg.getMessageContent());//test output 
		      connector.send(this, msg);          
		    } 
		  }
	  } 
	  /** 
	   * send respond to the client request 
	   */ 
	  public void send(Connector connectorFrom, Message msg){ 
	    Message respondMsg = new Message(); 
	    Clock clock = new Clock(); 
	    respondMsg.setTime(clock.getCurrentTime()); 
	    connectorFrom.send(this, respondMsg); 
	    System.out.println("server got client request and responds with  \t\t\t " 
	                       + respondMsg.getMessageContent());//test output 
	  } 
	  /** 
	   * BroadcastTask sends broadcastTime() at regular intervals  
	   */ 
	  class BroadcastTask extends TimerTask { 

	    AtomicInteger numberMessages = new AtomicInteger( 1 );//defines how many messages will be sent    

	    public void run() {      
	      if (numberMessages.get() > 0) { 
	        broadcastTime();              //DIESER TEIL WIRD "VERSCHLUCKT" 
	        numberMessages.decrementAndGet(); 
	      } else {  
	        System.out.println("messages transmitted"); 
	        timer.cancel();              
	      } 
	    } 
	  }  
	}
müsste so eigentlich hinhauen. connectorList ist das objekt, auf das synchronisiert wird. die beteiligten felder sind private, damit sie nicht von aussen modifziert werden können. die anzahl der messages wird in einem AtomicInteger vorgehalten, der dafür sorgt, dass wertmanipulationen atomar bleiben.
 

didjitalist

Bekanntes Mitglied
wenn die methode Connector#send nicht blockierend ist, solltest du weiterhin nicht mit dem feld Message arbeiten, sondern immer ein frisches objekt erzeugen.
 

skywalker

Aktives Mitglied
cool, auf den ersten blick funktioniert das so. :)

didjitalist hat gesagt.:
wenn die methode Connector#send nicht blockierend ist, solltest du weiterhin nicht mit dem feld Message arbeiten, sondern immer ein frisches objekt erzeugen.

noch eine (vielleicht blöde) frage - wo würd ich das frische msg objekt erzeugen?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Timer bzw. TimerTask Frage Java Basics - Anfänger-Themen 7
B problem mit timer/timertask, Farbverlauf Java Basics - Anfänger-Themen 10
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
E Threads Timer Java Basics - Anfänger-Themen 6
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
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

Ähnliche Java Themen

Neue Themen


Oben