scheduleAtFixedRate scheduleWithFixedDelay Unterschied?

J

Jessy12

Gast
Ja, wie der Titel schon sagt: Was ist denn nun der Unterschied zwischen diesen beiden Methoden? Für micht sehen die völlig identisch aus ...

Danke :)
 
J

Jessy12

Gast
Da der Thread schonmal offen ist, habe ich gleich noch eine weitere Frage, auch wenn sie nicht wirklich was mit dem Titel zu tun hat. :) Aber sont müsste ich einen neuen Thread aufmachen ... :(

Beim Experimentieren mit Threads auf eine Exception gestoßen, die ich mir nicht erklären kann:

Java:
package testflaeche;

import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.*;

public class Test7 extends Thread {
	public static ReentrantLock lock = new ReentrantLock();
	
	@Override
	public void run() {
		lock.tryLock();
			System.out.println("TEST");
			try {
				Thread.sleep(5000);
			}
			catch(InterruptedException exc) {
				exc.printStackTrace();
			}
		if(lock.isLocked()) lock.unlock();
		System.out.println("TEST3");
	}

	public static void main(String[] args) {
		ExecutorService exec = Executors.newCachedThreadPool();
		Test7 t1 = new Test7();
		Test7 t2 = new Test7();
		exec.execute(t1);
		exec.execute(t2);
	}
}

tryLock() hat ja nur den Sinn, dass wenn der lock() schon drinne ist, tryLock() trotzdem in den kritischen Bereich eintritt und den Zusatz des Rückgabewerts, ob beim Eintritt der Lock gesetzt war oder nicht. Wenn er nicht gesetzt war, dann setzt in tryLock(), also verhält sich die Methode in dem Fall wie ein normaler lock().
Aber warum bekomme ich bei unlock() eine IllegalMonitorStateException? Woher rührt diese?

Danke im Voraus
 
J

Jessy12

Gast
Ich habe mir die API davor auch schon angeschaut und ich sehe bei der Methodenbeschreibung keinen wirklichen Unterschied. Die Rückgabe ist gleich und die Parameter haben genau die gleiche Aufgabe ...

Der Fehler kommt beim Aufruf von unlock() und es liegt irgendwie an dem tryLock() ... Ich glaube die IllegalMonitorStateException kommt immer, wenn unlock() aufgerufen wird, obwohl kein lock() vorherrscht. Aber ich frage doch vorher ab, ob der lock() da ist :(
 
J

Jessy12

Gast
Ok, das Problem zwei lässt sich lösen, wenn ich isLocked() mit isHeldByCurrentThread() austausche. Allerdings ist mir hier der Unterschied auch nicht ganz klar. in der API steht, dass isLockes() prüft, ob irgendein Thread den Lockt hält und bei isHeldByCurrentThread() eben ob der gerade laufende Thread den Lock hält. Den Lock/Monitor hält doch immer das Objekt auf dem ich die lock() Methode aufrufe ... Dann ergeben die Methoden aber in meinen Augen keinen Sinn. Entweder das ReentrantLock hat den Monitor oder eben nicht, das hat doch nichts mit irgendeinem/dem aktuellen Thread zu tun ... Ich kenne mich mit Threads noch nicht so gut aus und es wäre toll, wenn mir jemand erklären könnte, was da mit "current Thread" und "any Thread" genau gemeint ist :)
 

Noctarius

Top Contributor
Ok dann kopiere ich dir den Text der 2 Methoden jetzt noch und dann vergleichen wir mal was da genau steht:

scheduleAtFixedRate:
Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period; that is executions will commence after initialDelay then initialDelay+period, then initialDelay + 2 * period, and so on. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor. If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.

scheduleWithFixedDelay:
Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given delay between the termination of one execution and the commencement of the next. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor.

Jetzt frage ich dich, was ist der Unterschied? Also in meinen Augen steht er ganz klar da!
 
J

Jessy12

Gast
scheduleAtFixedRate() lässt anscheinen nicht zu, dass sich zwei Aufrufe überschneiden bzw. verlängert gegebenenfalls die Periode, wenn der Thread nicht innerhalb der Periode zuendegeführt werden konnte. scheduleWithFixedDelay() hingegen lässt auch zu, dass zwei Aufrufe parallel nebeneinander existieren können, falls die Periode zu kurz ist. Sehe ich das richtig?

Wenn ich dieses Szenario aber nachstelle, dann verhalten sich beide Methoden gleich. Im folgenden Code kommt es nicht zur Überschneidung zweier Aufrufe:

Java:
package testflaeche;

import java.util.concurrent.*;
import java.util.concurrent.locks.*;

public class Test8 implements Runnable {
	@Override public void run() {
		try{
			System.out.println("start");
			Thread.sleep(10000);
			System.out.println("ende");
		}
		catch(InterruptedException exc) {
			System.out.println("exc");
		}
	}
	
	public static void main(String[] args) {
		ScheduledExecutorService serv = Executors.newSingleThreadScheduledExecutor();
		serv.scheduleWithFixedDelay(new Test8(), 0, 1, TimeUnit.SECONDS);
	}
}
 

Noctarius

Top Contributor
Tatsächlich sind in der Standardimplementierung beide Versionen nahezu identisch, so dass kein Unterschied auffällt. Trotzdem darfst du dich nur bei atFixedRate darauf verlassen, dass es so ist. Das macht der Name auch klar. Fixe Rate ist definitiv die Verzögerung zwischen 2 Ausführungen, Fixes Delay ist die Verzögerung zwischen 2 Starts.
 

r.w.

Bekanntes Mitglied
Tatsächlich sind in der Standardimplementierung beide Versionen nahezu identisch, so dass kein Unterschied auffällt. Trotzdem darfst du dich nur bei atFixedRate darauf verlassen, dass es so ist. Das macht der Name auch klar. Fixe Rate ist definitiv die Verzögerung zwischen 2 Ausführungen, Fixes Delay ist die Verzögerung zwischen 2 Starts.

Ich würde daraus eher schließen, dass bei scheduleAtFixedRate der Zeitraum von Start zu Start und bei scheduleWithFixedDelay der Zeitraum zwischen Beendigung der Aufgabe und Start der nächsten gemeint ist.

Oder liege ich da falsch?
 

r.w.

Bekanntes Mitglied
Dann würden ja doch beide Methoden das Selbe machen.

Ich denke, eben nicht. :)

Bei scheduleAtFixedRate wird nach dem Start des ersten Aufrufs plus einem fixen Zeitraum der nächste Aufruf gestartet.

Bei scheduleWithFixedDelay wird nach dem Start des Aufrufs gewartet, bis die Aufgabe erledigt ist, und ab da noch einmal der übergebene Zeitraum.

Das heisst, wenn man wirklich fixe Frame-Raten erzielen möchte, hilft nur scheduleAtFixedRate.
Da scheduleWithFixedDelay immer von der Dauer der Aufgabe beeinflusst wird.

Womit ich ja eigentlich Deiner ursprünglichen Aussage zustimme, außer diesem Teil...
...Fixe Rate ist definitiv die Verzögerung zwischen 2 Ausführungen, Fixes Delay ist die Verzögerung zwischen 2 Starts...
Da lese ich keinen Unterschied zwischen Ausführungen und Starts. ;-)
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Ok also es gibt einen Unterschied. Zwar warten beide Versionen bis der vorherige Task fertig ist, atFixedRate fängt aber sofort mit dem nächsten an, falls die Wartezeit bis dahin schon abgelaufen ist während withFixedDelay dann anfängt die Verzögerung zu messen. Mea culpa:

Java:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Schedule implements Runnable {
	private static long timer1 = System.currentTimeMillis();
	private static long timer2 = System.currentTimeMillis();

	private final boolean fixedRate;

	private Schedule(final boolean fixedRate) {
		this.fixedRate = fixedRate;
	}

	@Override
	public void run() {
		try {
			System.out.println("start - " + getTypeDescription() + " - "
					+ getMS());

			Thread.sleep(10000);
			System.out.println("ende - " + getTypeDescription());

			if (fixedRate) {
				timer2 = System.currentTimeMillis();
			} else {
				timer1 = System.currentTimeMillis();
			}

		} catch (final InterruptedException exc) {
			System.out.println("exc");
		}
	}

	private String getTypeDescription() {
		return fixedRate ? "scheduleAtFixedRate" : "scheduleWithFixedDelay";
	}

	private long getMS() {
		return System.currentTimeMillis() - (fixedRate ? timer2 : timer1);
	}

	public static void main(final String[] args) {
		final ScheduledExecutorService executor = Executors
				.newScheduledThreadPool(10);

		executor.scheduleWithFixedDelay(new Schedule(false), 0, 1,
				TimeUnit.SECONDS);

		executor.scheduleAtFixedRate(new Schedule(true), 0, 1, TimeUnit.SECONDS);
	}
}

Code:
start - scheduleWithFixedDelay - 3
start - scheduleAtFixedRate - 3
ende - scheduleWithFixedDelay
ende - scheduleAtFixedRate
start - scheduleAtFixedRate - 0
start - scheduleWithFixedDelay - 1001
ende - scheduleAtFixedRate
start - scheduleAtFixedRate - 0
ende - scheduleWithFixedDelay
start - scheduleWithFixedDelay - 1001
ende - scheduleAtFixedRate
start - scheduleAtFixedRate - 0

PS: @ TO: newSingleThreadedExecutor kann definitiv keine 2 Tasks gleichzeitig ausführen (fällt mir gerade so auf ;))
 

Noctarius

Top Contributor
Doch parallel geht schon, mit einem ThreadPoolExecutor, aber nicht mit dem SingleThreaded wie vom TO genutzt.

Es gibt abgesehen von Framerates (die ich niemals so implementieren würde, dafür gibt es den Mainloop), aber andere Dinge die durchaus parallel mit Verzögerung abgearbeitet werden könnten, z.B. Aufräumarbeiten.
 

r.w.

Bekanntes Mitglied
Doch parallel geht schon, mit einem ThreadPoolExecutor, aber nicht mit dem SingleThreaded wie vom TO genutzt.
Ach so, da hab ich Deine Aussage falsch interpretiert. :)


...Framerates (die ich niemals so implementieren würde, dafür gibt es den Mainloop),
Dazu wage ich zur Zeit keine Aussage, da ich mich, abgesehen von kleineren Animationen,
noch nicht allzu intensiv damit beschäftigt hab. Timing ist aber insgesamt schon sehr interessant. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G scheduleAtFixedRate Java Basics - Anfänger-Themen 6
MoxMorris Integer.MAX_VALUE und Double.MAX_VALUE Unterschied Java Basics - Anfänger-Themen 3
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
P Unterschied Installation von zipped JDK vs Installer-JDK (auf Windows)? Java Basics - Anfänger-Themen 2
S Unterschied zwischen Denkweisen Java Basics - Anfänger-Themen 13
M Unterschied Integer.toString(x) und x.toString() Java Basics - Anfänger-Themen 22
H Arrays: Größten Zahlen Unterschied herausfinden Java Basics - Anfänger-Themen 20
Ras Unterschied zwischen parser xml and api xml Java Basics - Anfänger-Themen 7
K Unterschied Information Hiding und Kapselung? Java Basics - Anfänger-Themen 2
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
jhCDtGVjcZGcfzug Was ist der Unterschied zwischen diesen Quellcodes? Java Basics - Anfänger-Themen 3
G Methoden wo ist der Unterschied?? Java Basics - Anfänger-Themen 11
D Unterschied charAt() substr() Java Basics - Anfänger-Themen 3
Y Unterschied zwischen WindowBuilder und herkömmlichen erstellen des GUI´s? Java Basics - Anfänger-Themen 9
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
D Unterschied == und equals in Arrays Java Basics - Anfänger-Themen 2
H Unterschied Konstruktor und Klassenname x = new Klassenname; Java Basics - Anfänger-Themen 3
H .jar unterschied .class Java Basics - Anfänger-Themen 3
E Unterschied zwischen new und import Java Basics - Anfänger-Themen 5
O Unterschied Arrays, Listen, Mengen Java Basics - Anfänger-Themen 24
K Unterschied for-Schleife Java Basics - Anfänger-Themen 14
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
M Schlüsselworte Unterschied: String.matches und Pattern.compile Java Basics - Anfänger-Themen 2
G Unterschied Instanz- Klassenvariable Java Basics - Anfänger-Themen 11
C Methoden Unterschied zwichen public int, public static int und public static void Java Basics - Anfänger-Themen 2
Aprendiendo Unterschied zwischen Referenzvariable und Instanzvariable. Java Basics - Anfänger-Themen 2
H Unterschied BufferedReader und BufferedInputStream Java Basics - Anfänger-Themen 4
N Unterschied von Post- und Preinkrement Java Basics - Anfänger-Themen 3
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
T Unterschied dynamischer und statischer Laufzeittyp Java Basics - Anfänger-Themen 1
schoenosrockos Unterschied zwischen Objekten und vererbungen Java Basics - Anfänger-Themen 1
D Unterschied Date - Calendar Java Basics - Anfänger-Themen 1
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
J Warum ist das ein Unterschied (Integer / int) Java Basics - Anfänger-Themen 2
S Erste Schritte Unterschied "if" und "else if" Java Basics - Anfänger-Themen 27
F Erste Schritte Unterschied: Array "leer" / "null" Java Basics - Anfänger-Themen 3
V Unterschied x++ und x=x++ Java Basics - Anfänger-Themen 6
O Unterschied Baum <-> Automat Java Basics - Anfänger-Themen 2
A Klassen Unterschied Warteschlange, Stapel und Liste Java Basics - Anfänger-Themen 3
L Unterschied zwischen Klassen - und Instanzvarbiablen Java Basics - Anfänger-Themen 1
M Wo liegt der Unterschied? Deklaration Klasse oder Konstruktur Java Basics - Anfänger-Themen 3
S Unterschied print() und println() Java Basics - Anfänger-Themen 3
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
S Datentypen Unterschied elementare und zusammengesetzte/strukturierte Datentypen Java Basics - Anfänger-Themen 5
M Unterschied zwischen Classpath eines Eclipse Projektes und dem CLASSPATH? Java Basics - Anfänger-Themen 3
S Unterschied Ausführung in IDE <-> Befehlszeile Java Basics - Anfänger-Themen 0
C Unterschied Objekte! Java Basics - Anfänger-Themen 13
D Unterschied zwischen double und Double Java Basics - Anfänger-Themen 4
Q Unterschied zwischen static und keinem Modifier Java Basics - Anfänger-Themen 15
A Unterschied Textdatei und Quelltextdatei Java Basics - Anfänger-Themen 5
K Unterschied zwischen Jar, war und ear Dateien Java Basics - Anfänger-Themen 3
R Erste Schritte Unterschied Array-Parameter zu Array als Parameter? Java Basics - Anfänger-Themen 7
V Unterschied Array & ArrayList Java Basics - Anfänger-Themen 13
D Geschwindigkeits unterschied bei import? Java Basics - Anfänger-Themen 13
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
L Unterschied zu C++ Java Basics - Anfänger-Themen 6
A Unterschied JDK SDK Java Basics - Anfänger-Themen 4
L Objekterzeugung Unterschied..? Java Basics - Anfänger-Themen 6
K Unterschied zwischen break und continue in einer Schleife Java Basics - Anfänger-Themen 14
B Klassen Unterschied Konstruktoren. Java Basics - Anfänger-Themen 3
A Exakte Unterschied zwischen Java EE und Java SE? Java Basics - Anfänger-Themen 4
J Unterschied zwischen statische und nicht statische Methoden? Java Basics - Anfänger-Themen 14
S Interface Unterschied: setContentPane() & getContentPane().add Java Basics - Anfänger-Themen 5
Helgon Unterschied runnable und normale jar Java Basics - Anfänger-Themen 6
D Unterschied bidirectional unidirectional Java Basics - Anfänger-Themen 10
F Interface Unterschied von Attributen und Methoden bei abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
O Java unterschied zwischen Interface und Interface_Referenzen!!?? Java Basics - Anfänger-Themen 7
I Unterschied Lizenz EPL und LGPL Java Basics - Anfänger-Themen 7
P Unterschied Windowclosed / WindowClosing Java Basics - Anfänger-Themen 10
S Erste Schritte Grundsatzfragen Unterschied Java / PHP Java Basics - Anfänger-Themen 6
P Unterschied JRE innerhalb/ außerhalb des JDK Verzeichnisses? Java Basics - Anfänger-Themen 5
H printf: Unterschied %f und %g Java Basics - Anfänger-Themen 5
M Unterschied SDK 1.4 und 1.6 Java Basics - Anfänger-Themen 5
S Unterschied java.util.prefs / java.util.Properties Java Basics - Anfänger-Themen 3
J unterschied zwischen awt und swing Java Basics - Anfänger-Themen 6
T Unterschied in Zahlendarstellungen Java Basics - Anfänger-Themen 2
F Unterschied JPanel und JFrame Java Basics - Anfänger-Themen 5
K Unterschied Klassen- und Instanzattribute Java Basics - Anfänger-Themen 4
L Unterschied Konstruktor / Getter Setter Java Basics - Anfänger-Themen 13
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
C unterschied generische typen und supertypen als methodenparameter Java Basics - Anfänger-Themen 3
J Instanzvariablen - Lokale Variablen - warum der Unterschied? Java Basics - Anfänger-Themen 5
P Unterschied dieser 2 code Zeilen Java Basics - Anfänger-Themen 12
I Datentypen Unterschied in Deklaration von ArrayList Java Basics - Anfänger-Themen 26
G Unterschied e extends y vs ? extends y Java Basics - Anfänger-Themen 5
M Unterschied append / write aus der Klasse Writer Java Basics - Anfänger-Themen 2
M unterschied OutpuStreamWriter und BufferedWriter Java Basics - Anfänger-Themen 5
B Unterschied zwischen String & char Array? Java Basics - Anfänger-Themen 5
J Unterschied Instanzattribut und Referenzvariable Java Basics - Anfänger-Themen 4
J Unterschied bei Schleifen Java Basics - Anfänger-Themen 2
B Was ist der unterschied zwischen Singleton und Strategy? Java Basics - Anfänger-Themen 6
B Variablen: unterschied zwischen Klassen und Instanzvariable Java Basics - Anfänger-Themen 2
W Unterschied JFrame und JLabel bezüglich Layout? Java Basics - Anfänger-Themen 2
B Generische Vererbung was ist der Unterschied? Java Basics - Anfänger-Themen 4
B ArrayList generisch? was ist der Unterschied? Java Basics - Anfänger-Themen 4
H Unterschied zwischen 2 Date in Sekunden am einfachsten? Java Basics - Anfänger-Themen 5
tanja Der Unterschied Zwischen Arrays in Java und ADA Java Basics - Anfänger-Themen 11
ModellbahnerTT Unterschied zwischen zwei Frame close Varianten Java Basics - Anfänger-Themen 3
D Unterschied innere Klasse/ anonyme innere Klasse Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben