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 Displayauf 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 SchedulerSchnittstelle (die nichts anderes ist als ein Wrapper um ein ScheduledExecutorService. Beim Schreiben der scheduleMethode auf dem ist Schedulermir aufgefallen, dass ich entweder ein Supplier<T>Argument oder ein Callable<T>Argument verwenden kann, um die übergebene Funktion darzustellen. ScheduledExecutorServiceEnthä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?