Threads Verbraucht eine Zeitabfrage viele Rechen-Ressourcen?

chaostheory

Bekanntes Mitglied
Hallo,
einige meiner Programme nutzen Threads, die bestimmte Aufgaben in einem bestimmten Zeitintervall ausführen sollen (z.B. alle 10 Sekunden bestimmte Daten aktualisieren).
Dafür nutze ich diese simple Abfrage:
Java:
if(System.currentTimeMillis() > lastUpdateCheck + plugin.config().getUpdateInterval() * 1000) { [...]
Nun habe ich folgendes Problem: Ich habe es so eingestellt, dass der Thread alle 30 Server Ticks aufgerufen wird und die Zeit überprüft. Das Intervall kann man in einer Konfigurationsdatei einstellen. Stellt man dieses allerdings sehr niedrig, ist es möglicherweise kürzer als die 30 Server Ticks.
Nun die Frage: Verbraucht die Zeitabfrage viel Ressourcen oder kann ich den Thread einfach bei jedem Server Tick aufrufen und er überprüft die Zeit?
 
Naja, das in Millisekunen zu messen ist schon sehr fein. Wenn das eh nur 6 mal in der Minute passieren muss, kannst du auch in Sekunden messen, dann hast du deutlich weniger aufrufe also so.
 
Was mich etwas wundert ist, dass du in der
Code:
if
-Abfrage
Code:
System.currentTimeMillis()
hast. Das rufst du ja dann wahrscheinlich noch einmal auf und speicherst es dann auch in der Variable
Code:
lastUpdateCheck
. Wieso speicherst du den Wert nicht schon vor dem
Code:
if
in einer Variablen?
 
Ich dachte das so:
Java:
new Thread(new Runnable() {
    public void run() {
        while (true) {
            checkForNewData();
            try {
                Thread.sleep(10000); // 10 Sekunden
            } catch (Exception ignoreMe) {}
        }
    }
}).start();
 
Ich dachte das so:
Java:
new Thread(new Runnable() {
    public void run() {
        while (true) {
            checkForNewData();
            try {
                Thread.sleep(10000); // 10 Sekunden
            } catch (Exception ignoreMe) {}
        }
    }
}).start();

Da gibt es ein Problem: Ich brauche das für Minecraft Plugins vom Server-Mod Bukkit. Ich muss den Thread über den Server-Thread ausführen und mit Thread.sleep() würde ich dann den ganzen Server lahmlegen...
 
Hä? Wenn du da eigenen Code reinklopfen darfst, kannst du da doch auch nen Neuen Thread reinmachen, der solange schlafen darf, wie er will. Aber du kannst es so machen:
Java:
        while (true) {
            checkForNewData();
            try {
                Thread.yield();
            } catch (Exception ignoreMe) {}
        }
Dann kann der Thread-Sheduler deinen Code solange anhalten, wie gerade vn der Rechenlesitung her passt.
 
Java:
Timer timer=new Timer();
TimerTask task=new TimerTask()
{
   @Override
   public void run()
   {
      doStuff();
   }
};
timer.scheduleAtFixedRate(task,0,10000);
[EDIT]Btw, es handelt sich hier um java.util.Timer nicht javax.swing.Timer. Der Link oben passt nicht.[/EDIT]
 
Zuletzt bearbeitet:

Zurück
Oben