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 recordé fue que cada llamada a Display
debe ejecutarse en el mismo hilo en el que se invocó el método Display.create()
. 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 un Future<Boolean>
. Esto envía una función a mi interfaz Scheduler
(que no es más que una envoltura alrededor de ScheduledExecutorService
. Mientras escribía el método schedule
en el Scheduler
, noté que podría usar un argumento Supplier<T>
o un argumento Callable<T>
para representar la función que se pasa. ScheduledExecutorService
no contenía un reemplazo para Supplier<T>
pero noté que la expresión lambda () -> Display.isCloseRequested()
es en realidad compatible con ambos Callable<bool>
y Supplier<bool>
.
Mi pregunta es, ¿hay alguna diferencia entre esos dos, semánticamente o de otra manera? Si es así, ¿qué es, para que pueda adherirme a ella?