Przełączam się na Javę z C # po kilku zaleceniach z CodeReview. Tak więc, kiedy patrzyłem na LWJGL, przypomniałem sobie, że każde wywołanie Displaymusi być wykonane w tym samym wątku, w którym wywołano Display.create()metodę. Pamiętając o tym, przygotowałem klasę, która wygląda trochę tak.
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());
}
}
Pisząc tę klasę zauważysz, że stworzyłem metodę o nazwie, isClosed()która zwraca a Future<Boolean>. To wywołuje funkcyjne do mojego Schedulerinterfejsu (który nie jest niczym więcej niż owinięcie wokół ScheduledExecutorService. Pisząc ten schedulesposób na SchedulerZauważyłem, że mogę albo użyć Supplier<T>argumentu lub do Callable<T>argumentu do reprezentowania funkcji, która jest przekazywana w. ScheduledExecutorServiceNie zawierał przesłonięcie, Supplier<T>ale zauważyłem, że wyrażenie lambda () -> Display.isCloseRequested()jest w rzeczywistości zgodne z typem zarówno z, jak Callable<bool> i Supplier<bool> .
Moje pytanie brzmi: czy istnieje różnica między tymi dwoma, semantycznie czy inaczej - a jeśli tak, to co to jest, żebym mógł się do tego zastosować?