我正在尝试使用 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 上下文是线程绑定(bind)的。如果连接到 LWJGL 的时间太长,那么返回的 future 将提前脱离自身。
问题是在单元测试中,这绝对是顺畅的。但是,当我尝试调试程序时,对任何 display
的任何调用方法导致 lwjgl 抛出一个真正的异常(因为我的 lwjgl 库没有链接。这仍然作为 LwjglException
抛出,尽管如此)。由于某种原因,此异常并未从此处代码中的 try-catch 中获取,而是被吞噬了; future
永远不会异常完成。
所以在某处,我的异常被这段代码吞没了。
注意:display
只是 LWJGL 的 Display
的一个接口(interface)- 那里没有花哨的魔法。 scheduledExecutorService
是单线程计划执行器。
我也很感激 .submit()
和 schedule
在 scheduledExecutorService
都返回 Future<T>
但这缺少我想从 CompletableFuture<T>
使用的构图.如果可能的话,我希望能够继续使用它。
最佳答案
代码实际上完全按照它应该的方式工作。真正的问题是我预期的错误 java.lang.UnsatisifiedLinkError
,不是 Exception
而实际上是 Error
。修改代码以捕获 Throwable
可以解决此问题。
关于java - 发生异常时,ExecutorService runnable 从不点击尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29056439/