我正在尝试使用CompletableFuture<T>
来响应正在创建的LWJGL OpenGL上下文。这是通过调用open
上的LWJGLGameWindow
方法完成的。以下是相关代码:
@Override
public CompletableFuture<?> open() {
CompletableFuture<Void> future = new CompletableFuture<>();
scheduledExecutorService.schedule(() -> {
future.completeExceptionally(new TimeoutException("Could not establish contact with LWJGL"));
}, 2000, TimeUnit.MILLISECONDS);
scheduledExecutorService.execute(() -> {
try {
display.setDisplayMode(new DisplayMode(defaultWidth, defaultHeight));
display.create();
future.complete(null);
} catch (LWJGLException e) {
future.completeExceptionally(e);
}
});
return future;
}
我们的想法是推迟在计划的执行程序服务上创建显示。这被设置为单线程调度执行器服务,因为OpenGL上下文是线程绑定的。如果连接到LWJGL需要很长时间,那么返回的未来将会早早脱离。
问题是在单元测试中,这绝对是游泳的。但是,当我尝试调试程序时,对任何display
方法的任何调用都会导致lwjgl抛出一个真正的异常(因为我的lwjgl库没有链接。这仍然被抛出为{{1但是,)。由于某种原因,此代码中的try-catch没有获取此异常,而是吞下了异常; LwjglException
永远不会异常完成。
所以在这个行的某个地方,我的例外被这个代码吞没了。
注意:future
只是LWJGL display
周围的一个界面 - 那里没有奇特的魔法。 Display
是单线程预定执行程序。
我也很感谢scheduledExecutorService
上的.submit()
和schedule
都返回scheduledExecutorService
,但这缺少了我想在Future<T>
中使用的构图。如果可能的话,我希望能够继续使用它。
答案 0 :(得分:1)
代码实际上完全正常工作。真正的问题是我期待的错误java.lang.UnsatisifiedLinkError
不是Exception
,而是Error
。修改代码以捕获Throwable
解决了这个问题。