Ich bin von C # auf Java umgestiegen, nachdem ich einige Empfehlungen von CodeReview erhalten hatte. Als ich mich mit LWJGL befasste, fiel mir ein, dass jeder Aufruf von Display
auf dem gleichen Thread ausgeführt werden muss, auf dem die Display.create()
Methode aufgerufen wurde. Daran erinnernd, habe ich eine Klasse zusammengestellt, die ein bisschen so aussieht.
public class LwjglDisplayWindow implements DisplayWindow {
private final static int TargetFramesPerSecond = 60;
private final Scheduler _scheduler;
public LwjglDisplayWindow(Scheduler displayScheduler, DisplayMode displayMode) throws LWJGLException {
_scheduler = displayScheduler;
Display.setDisplayMode(displayMode);
Display.create();
}
public void dispose() {
Display.destroy();
}
@Override
public int getTargetFramesPerSecond() { return TargetFramesPerSecond; }
@Override
public Future<Boolean> isClosed() {
return _scheduler.schedule(() -> Display.isCloseRequested());
}
}
Beim Schreiben dieser Klasse werden Sie feststellen, dass ich eine Methode namens isClosed()
a erstellt habe Future<Boolean>
. Dies sendet eine Funktion an meine Scheduler
Schnittstelle (die nichts anderes ist als ein Wrapper um ein ScheduledExecutorService
. Beim Schreiben der schedule
Methode auf dem ist Scheduler
mir aufgefallen, dass ich entweder ein Supplier<T>
Argument oder ein Callable<T>
Argument verwenden kann, um die übergebene Funktion darzustellen. ScheduledExecutorService
Enthält kein überschreiben, Supplier<T>
aber ich habe festgestellt, dass der Lambda-Ausdruck () -> Display.isCloseRequested()
tatsächlich mit beiden Callable<bool>
und typkompatibel ist Supplier<bool>
.
Meine Frage ist, gibt es einen Unterschied zwischen diesen beiden, semantisch oder anderweitig - und wenn ja, was ist das, damit ich mich daran halten kann?