Я перешел на 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> .
Мой вопрос заключается в том, есть ли разница между этими двумя, семантически или иным образом, и если да, то каково это, чтобы я мог придерживаться этого?