Я переходив на Java з C # після деяких рекомендацій, отриманих у CodeReview. Отже, коли я дивився на LWJGL, одне, що мені запам'яталося, - це те, що кожен виклик Display
повинен бути виконаний на тій самій нитці, на яку Display.create()
був викликаний метод. Пам’ятаючи це, я збила клас, який виглядає приблизно так.
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());
}
}
Під час написання цього класу ви помітите, що я створив метод, який називається isClosed()
a Future<Boolean>
. Це відправляє функції на мій Scheduler
інтерфейс (який є не більше ніж оболонка навколо ScheduledExecutorService
. При написанні schedule
методу на Scheduler
я помітив , що я міг би або використовувати Supplier<T>
аргумент або в Callable<T>
аргумент для представлення функції, яка передається в. ScheduledExecutorService
Не містять переосмислити, Supplier<T>
але я помітив, що лямбда-вираз () -> Display.isCloseRequested()
насправді є типом, сумісним і з Callable<bool>
і Supplier<bool>
.
Моє запитання: чи є різниця між цими двома, семантично чи інакше - і якщо так, то що це, то я можу дотримуватися цього?