# Zur vollen Stunde



## Nobody23 (26. November 2008)

Hallo

Ich brauch Rat, ich habe die Aufgabe immer zur vollen Stunde eine Aktion zu starten.

Ich hab auch "Timer" in Java gefudnen, der jedoch kann nur "Warte [x]ms, dann tue".

Ich brauch jedoch "Prüfe ob [X:00Uhr] ist, wenn ja dann tue".

Wie krieg ich das hin?

Gruss
Nobody


----------



## benhaze (26. November 2008)

Das du da noch nicht selber drauf gekommen bist....
Man könnte ja im Ersten *tue* das tun, was du wolltest..

also:

Warte [x]ms, dann tue:
-- Prüfe ob [X:00Uhr] ist, wenn ja dann tue


----------



## Johannes7146 (26. November 2008)

```
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/* extends Thread brauchst du damit du Thread.sleep() aufrufen kannst. Dadruch wartet der Prozess ohne die CPU zubeanspruchen*/
public class Anwendung extends Thread {
	public static void main(String[] args) {
		// Try catch fängt fehler ab und gibt diese (in diesem Fall) aus
		try {
			/* Console ausgabe das das Programm gestartet wurde */
			System.out.println("Start");
			/* Counter = die Zeit wie lange der Thread laufen soll (in Sekunden) */
			int counter = 60 * 60 * 24;
			/* Diese Schleife läuft so lange wie der Counter größer als 0 ist */
			while (counter > 0) {
				// Hier wird ein neues Datum angelegt mit dem aktuellem Datum
				// (incl uhrzeit)
				Date d = new Date(System.currentTimeMillis());
				// Hier wird geprüft ob minuten und Sekunden auf 0 stehen
				if (d.getMinutes() == 0 && d.getSeconds() == 0) {
					// Sobald du in dieser if bedingung bist, kannst du deine
					// Action aufrufen, in diesem Beispeil öffnet sich ein
					// kleines Fenster
					JOptionPane.showMessageDialog(new JFrame(), "*blub*");
				}
				// Hier lässt du den Thread für 1 Sekunde warten
				Thread.sleep(1000);
				// Hier wird der Zähler manipuliert (zählt runter)
				counter--;
			}
			// Hier die Ausgabe das das Programm beendet wurde.
			System.out.println("Stop");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
```


----------



## Thomas Darimont (26. November 2008)

Hallo,

ging auch so:

```
/**
 * 
 */
package de.tutorials;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 * 
 */
public class EveryHourExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Calendar calendar = new GregorianCalendar();
long millisToNextFullHour = TimeUnit.MINUTES.toMillis(calendar
				.getMaximum(Calendar.MINUTE)
				- calendar.get(Calendar.MINUTE) )
				+ TimeUnit.SECONDS.toMillis(calendar
						.getMaximum(calendar.SECOND)
						- calendar.get(Calendar.SECOND) + 1L);
        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("Ding dong: " + new Date());
            }
        }, millisToNextFullHour, TimeUnit.HOURS.toMillis(1L));
    }

}
```

Mit Quartz geht das noch ein wenig einfacher:
http://www.opensymphony.com/quartz/

Gruß Tom


----------



## takidoso (26. November 2008)

Hallo
das obige Beispiel ist nach zweiten Hinsehen vermutlich nicht sehr zuverlässig,  zumindest kann man es noch sehr optimieren, damit nicht ständig der Timer (hier eigetnlich Thread) aufwacht.
Also ich würde die jetzige Zeit nehmen und die nächste volle Stunde mittels GregorianCalender ermitteln. dann würde ich einen java.util.Timer und einen TimerTask (der dann jede Stunde was machen soll) erstellen, wobei der Timer mit dem ersten auftreten des Ereignisses und dem delay einer Stunde und dem TimerTask gefüttert wird (methode: *timer.scheduleAtFixedRate(timerTask,calen.getTime(), 60*60*1000);* und fertig sei dei Laube.
Optimerit in sofern, dass der TimerTask vom Timer tatsächlich nur einmal die Stunde erwacht.

haha Tom ist mir gewissermaßen zuvorgekommen, mit obigen Beispiel meine ich natürlich das von Johannes7146


----------

