Thread soll JEDE STUNDE einmalig eine Aktion ausführen

Lautsprecher

Erfahrenes Mitglied
Hi,
ich möchte später mal jede volle Stunde meine Datenbank checken und gegebenenfalls ein Update ausführe. Momentan bin ich noch am Testen und Üben ob es überhaupt funktioniert.
Ich habe mir dafür folgende Methode ausgedacht:

Code:
/*Dekl. in der Klasse */
public int wakeHour = 0;
public  int wakeMinute = 0;
public final int wakeSecond = 30;


public void arbeitszeitcheck() 
 {
     Thread sanduhr = new Thread()
     {
          public void run()
          {
	boolean checked = false;
	boolean schleife = true;
    	while (schleife)
	{ 
	    Calendar cal = new GregorianCalendar();
	    wakeHour = cal.get(Calendar.HOUR_OF_DAY);	
	    wakeMinute = cal.get(Calendar.MINUTE);
	    cal.setTime(new Date());
	    if(cal.get(Calendar.HOUR_OF_DAY) == wakeHour &&
	       cal.get(Calendar.MINUTE) == wakeMinute &&   				        cal.get(Calendar.SECOND) == wakeSecond)  
	   {
	       if (!checked)
	       {
	            System.out.println("ES GEHT, JUHU DA WAHNSINN !!");
	            checked = true;
	        }
	  }
            }
       };
      sanduhr.start();
      pack();
 }

Zum Prüfen ob's überhaupt geht, wollte ich jede Minute eine Consolen-Meldung ausgeben.
Den Schalter checked setzte ich damit die Ausgabe nur 1 x kommt. Zuvor hatte ich immer das Problem, wenn die If-Bedigung mit der Zeit übereinstimmt..... -> Es eine
Endlos-Ausgabe in der Console gab.
Jetzt jedoch habe ich das Problem, dass es nur in der 1. Minute klappt, danach komme ich nicht mehr in meine if-Schleife (!checked) was ja logisch ist. Ich habe auch schon versucht unter checked = true noch einen schalter = false für die while-Schleife einzubauen. und dann über sanduhr.start() diesen Schalter wieder auf true zu setzen.
Jedoch wird die while-Schleife nicht mehr aufgerufen.

Weiß vielleicht jemand wo noch der Wurm drin ist
Danke
 
Hi!

Ich hab zwar noch nie mit Threads programmiert, aber was würde gegen einen Timer sprechen? Die Klasse wäre in der Java API schon vorhanden, und würde genau deinen Zwecken, wenn ich sie richtig verstanden hab :p , genügen, oder? Sollte doch reichen auf einen "Tick" alle Stunden zu reagieren, und dann mit dem Abchecken auf Änderungen zu beginnen.

Aber wie gesagt, ich hab noch nicht viel mit Threads zu tun gehabt, und lieg wahrscheinlich daneben :p

Gruß
TOM
 
Hi Thomas,
dein Link klingt interessant, jedoch habe ich ein wenig Probleme wie ich das auf eine Volle Stunde umbasteln soll. Wäre nett wenn Du mir da nochmal helfen könntest.
Für was steht denn zum Beispiel bei INTERVAL_ONE_WEEK die 1000
 
Hi,
ich habe jetzt mein Problem gelöst. Vielleicht etwas umständlich. Wäre sicher schöner gegangen aber ich bin zufrieden. Es läuft wenigstens. Vielleicht ist es dem einen oder anderem mal eine Hilfe.

Grüße




Code:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.GregorianCalendar;
import java.util.Calendar;


public class TimerTaskExample {
	
public static void main(String[] args) throws Exception{
Timer timer = new Timer();
		
//Jede Minute
final long INTERVAL_ONE_WEEK = 60*1000;
int wakeHour   = 0;
int wakeMinute = 0;
int wakeDay = 0;
int wakeMonth = 0;
int wakeYear = 0;
String datumzusammensetzen = null;

Calendar cal = new GregorianCalendar();
wakeMinute = cal.get(Calendar.MINUTE);
wakeHour = cal.get(Calendar.HOUR_OF_DAY);
wakeDay = cal.get(Calendar.DAY_OF_MONTH);
wakeMonth = cal.get(Calendar.MONTH);
		
// zählt Monat von 0 bis 11
wakeMonth = wakeMonth + 1;
wakeYear = cal.get(Calendar.YEAR);
System.out.println(wakeMinute + " Das sind die Minuten");
System.out.println(wakeHour + " Das sind die Stunden");
System.out.println(wakeDay + " Das ist der Tag");
System.out.println(wakeMonth + " Das ist der Monat");
System.out.println(wakeYear + " Das ist das Jahr");
datumzusammensetzen = 
Integer.toString(wakeDay) + "." + Integer.toString(wakeMonth) + "." + Integer.toString(wakeYear) + " " +Integer.toString(wakeHour) + ":" + Integer.toString(wakeMinute);

System.out.println(datumzusammensetzen + "  zusammengesetzt");
	
Date startTime = new SimpleDateFormat("dd.MM.yyyy HH:mm").parse(datumzusammensetzen);
System.out.println(startTime);
		
timer.scheduleAtFixedRate(new TimerTask() {
	int i= 0;
	public void run()
	{	
                    i++;
	    System.out.println(i +". Minute");
	}
}, startTime, INTERVAL_ONE_WEEK);

}

}
 
Zurück