He estado cambiando a Java desde C # después de algunas recomendaciones de algunos en CodeReview. Entonces, cuando estaba buscando en LWJGL, una cosa que recordaba era que cada llamada a Displaydebe ejecutarse en el mismo hilo en el que Display.create()se invocó el método. Recordando esto, preparé una clase que se parece un poco a esto.
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());
}
}
Mientras escribe esta clase, notará que creé un método llamado isClosed()que devuelve a Future<Boolean>. Esto envía una función a mi Schedulerinterfaz (que no es más que un contenedor alrededor de un ScheduledExecutorService. Al escribir el schedulemétodo en el Schedulernoté que podía usar un Supplier<T>argumento o un Callable<T>argumento para representar la función que se pasa. ScheduledExecutorServiceNo contenía un anule Supplier<T>pero, noté que la expresión lambda () -> Display.isCloseRequested()es de tipo compatible con ambos Callable<bool> y Supplier<bool> .
Mi pregunta es, ¿hay alguna diferencia entre esos dos, semánticamente o de otro modo? Y, de ser así, ¿cuál es, para que pueda adherirme?