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
Danke
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);
}
}
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.
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.
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);
}
}
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.
Lies doch das Javadoc Ich habe es sogar extra kopiert *g*
scheduleAtFixedRate:
...will commence after initialDelay then initialDelay+period, then initialDelay + 2 * period, and so on...
scheduleWithFixedDelay:
...given delay between the termination of one execution and the commencement of the next....
Dann würden ja doch beide Methoden das Selbe machen.
Da lese ich keinen Unterschied zwischen Ausführungen und Starts. ;-)...Fixe Rate ist definitiv die Verzögerung zwischen 2 Ausführungen, Fixes Delay ist die Verzögerung zwischen 2 Starts...
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);
}
}
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
Ich denke, eben nicht. Das heisst, wenn man wirklich fixe Frame-Raten erzielen möchte, hilft nur scheduleAtFixedRate.
Scheinbar ist das mit der Implementierung nicht möglich.
Ach so, da hab ich Deine Aussage falsch interpretiert.Doch parallel geht schon, mit einem ThreadPoolExecutor, aber nicht mit dem SingleThreaded wie vom TO genutzt.
Dazu wage ich zur Zeit keine Aussage, da ich mich, abgesehen von kleineren Animationen,...Framerates (die ich niemals so implementieren würde, dafür gibt es den Mainloop),