在CodeReview提出了一些建议之后,我一直在从C#切换到Java。因此,当我查看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>
,但我注意到,lambda表达式() -> Display.isCloseRequested()
实际上是与输入同时兼容Callable<bool>
和 Supplier<bool>
。
我的问题是,两者在语义上或其他方面是否有区别-如果是,那是什么,所以我可以坚持下去?