Eu tenho mudado para Java a partir de C # depois de algumas recomendações de alguns no CodeReview. Portanto, quando eu estava pesquisando o LWJGL, lembrei-me de que toda chamada a Displayser executada no mesmo encadeamento em que o Display.create()método foi chamado. Lembrando disso, criei uma aula que se parece um pouco com isso.
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());
}
}
Ao escrever esta classe, você notará que eu criei um método chamado isClosed()que retorna a Future<Boolean>. Isso envia uma função para minha Schedulerinterface (que nada mais é do que um invólucro em torno de um ScheduledExecutorService. Ao escrever o schedulemétodo no Scheduler, observei que eu poderia usar um Supplier<T>argumento ou um Callable<T>argumento para representar a função que é transmitida. ScheduledExecutorServiceNão continha um substituir por Supplier<T>mas notei que a expressão lambda () -> Display.isCloseRequested()é realmente do tipo compatível com ambos Callable<bool> e Supplier<bool> .
A minha pergunta é: existe uma diferença entre os dois, semanticamente ou de outra forma - e se sim, o que é, para que eu possa aderir?