Sto passando a Java da C # dopo alcuni consigli da alcuni su CodeReview. Quindi, quando stavo esaminando LWJGL, una cosa che ricordavo era che ogni chiamata a Displaydoveva essere eseguita sullo stesso thread su cui Display.create()era stato invocato il metodo. Ricordando questo, ho preparato una classe che assomiglia un po 'a questa.
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());
}
}
Mentre scrivi questa classe noterai che ho creato un metodo chiamato isClosed()che restituisce a Future<Boolean>. Questo invia una funzione alla mia Schedulerinterfaccia (che non è altro che un wrapper attorno a un ScheduledExecutorService. Mentre scrivevo il schedulemetodo su Schedulerho notato che avrei potuto usare un Supplier<T>argomento o un Callable<T>argomento per rappresentare la funzione che è passata. ScheduledExecutorServiceNon conteneva un override for, Supplier<T>ma ho notato che l'espressione lambda () -> Display.isCloseRequested()è in realtà compatibile con entrambi i tipi Callable<bool> e Supplier<bool> .
La mia domanda è: c'è una differenza tra quei due, semanticamente o in altro modo - e in tal caso, che cos'è, quindi posso aderire ad esso?