Я переходив на 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> .
Моє запитання: чи є різниця між цими двома, семантично чи інакше - і якщо так, то що це, то я можу дотримуватися цього?