Я перешел на 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()
который возвращает Future<Boolean>
. Это отправляет функции на мой Scheduler
интерфейс (который является не более чем оболочка вокруг ScheduledExecutorService
. При написании schedule
метода на Scheduler
я заметил , что я мог бы либо использовать Supplier<T>
аргумент или в Callable<T>
аргумент для представления функции, которая передается в. ScheduledExecutorService
Не содержат переопределить, Supplier<T>
но я заметил, что лямбда-выражение () -> Display.isCloseRequested()
на самом деле совместимо с типами Callable<bool>
и Supplier<bool>
.
Мой вопрос заключается в том, есть ли разница между этими двумя, семантически или иным образом, и если да, то каково это, чтобы я мог придерживаться этого?