Je suis passé à Java à partir de C # après quelques recommandations de la part de CodeReview. Donc, quand je regardais LWJGL, une chose dont je me souvenais était que chaque appel à Displaydevait être exécuté sur le même thread que la Display.create()méthode était invoquée. En me souvenant de cela, j'ai concocté un cours qui ressemble un peu à ça.
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());
}
}
En écrivant cette classe, vous remarquerez que j'ai créé une méthode appelée isClosed()qui renvoie a Future<Boolean>. Cela envoie une fonction à mon Schedulerinterface (qui n'est rien de plus qu'un wrapper autour d'un ScheduledExecutorService. Lors de l'écriture de la scheduleméthode sur le Schedulerj'ai remarqué que je pouvais soit utiliser un Supplier<T>argument ou un Callable<T>argument pour représenter la fonction transmise. ScheduledExecutorServiceNe contenait pas de remplacer pour Supplier<T>mais j'ai remarqué que l'expression lambda () -> Display.isCloseRequested()est en fait compatible avec les deux types Callable<bool> et Supplier<bool> .
Ma question est, y a-t-il une différence entre ces deux, sémantiquement ou autrement - et si oui, qu'est-ce que c'est, pour que je puisse y adhérer?