Um 14:00 eine Methode aufrufen

Fohnbit

Top Contributor
Hallo!

Ich benötige in meiner Klasse eine Zeitfunktion.
Es soll jeden Tag um 14:00 eine Methode in meiner Klasse aufgerufen werden.

Geht das mit "Bordmitteln" ohne eine Schleife die ständig die aktuelle Zeit checkt?

Ich habe Quartz 2 Scheduler gefunden.
Aber dort wird eine eigene Klasse getriggert. Da müßte ich ein Interface erstellen die beide nutzen, um die gefeuerte methode in meine Klasse zu bekommen?

Meine Klasse soll aber nicht blockieren.

Danke!
 
Ach, noch eine Möglichkeit:
Beim erstellen den Timestamp nehmen, berechnen wie lange 14:00 noch entfernt ist und dann einen ScheduledExecutorService mit 24h Intervall?

Aber wenn mal die Zeit am PC geändert wird?
 
Du könntest den Thread mit sleep()/wait() warten lassen und wenn die Systemzeit geändert wird den Thread aufwecken, eine neue Schlafenszeit berechnen und wieder einschlafen lassen oder die Methode ausführen, wenn der Zeitpunkt nicht mehr weit genug entfernt ist oder in der Vergangenheit liegt.
 
Hallo!

Ok, heißt aber ich muss eine eigene Klasse hierfür nehmen.
Denn Sleep blockiert mir meine eigene Klasse ja, oder?

Und woher kann ich wissen ob die Systemzeit geändert wurde?
 
Mit Thread.sleep( Zeit in ms ) kannst du deinen Thread schlafen legen und der wird dann nach gegebener Zeit aufgeweckt.
Ist aber bei großen Zahlen ungenau, deshalb würde ich eine kleinere Zeit einstellen und wieder überprüfen.

Und wenn du einen neuen Thread (Stichwort: Multithreading) erstellst blockierst du auch nicht dein Program.

Kannst dann in dem neuen Thread alle 60.000ms (oder weniger) überprüfen ob die gewünschte Zeit erreicht wurde.

Thread thread = new Thread( Runnable ).start();
 
Hallo!

Hmmm ... ich habe nun mal Quartz 2 getestet:
Java:
JobDetail job1 = JobBuilder.newJob(TwilightNight.class)
				.withIdentity("TwilightNight", "group1").build();
		
		JobDetail job2 = JobBuilder.newJob(TwilightNight.class)
				.withIdentity("TwilightDay", "group2").build();

		Trigger trigger = TriggerBuilder
				.newTrigger()
				.withIdentity("Night", "group1")
				.withSchedule(CronScheduleBuilder.cronSchedule("0 17 17 * * ?"))
				.build();

		Trigger trigger2 = TriggerBuilder
				.newTrigger()
				.withIdentity("Day", "group2")
				.withSchedule(CronScheduleBuilder.cronSchedule("0 20 17 * * ?"))
				.build();

		// schedule it
		Scheduler scheduler;
		try {
			scheduler = new StdSchedulerFactory().getScheduler();
			scheduler.start();
			scheduler.scheduleJob(job1, trigger);
			scheduler.scheduleJob(job2, trigger2);

		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Soweit klappt es (mit einem Trigger)
Doch mit mehreren weiß ich nicht wie es zu handhaben ist. For allem der Event Listener:
Java:
/**
	 * Quartz Event
	 */
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		
		if (context.getFireInstanceId().compareTo("Night") == 0) {
			System.out.println("Night FIRE");
			// Am Abend
			morningTime = false;
			checkIllumination();
		}
		
		if (context.getFireInstanceId().compareTo("Day") == 0) {
			System.out.println("Day FIRE");
			// Am Morgen
			morningTime = true;
			checkIllumination();
		}

	}

Weiß hier jemand bescheid? Danke!
 

Zurück
Oben