当异常发生时,ExecutorService runnable永远不会命中

时间:2015-03-15 01:57:51

标签: java java-8 lwjgl

我正在尝试使用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>中使用的构图。如果可能的话,我希望能够继续使用它。

1 个答案:

答案 0 :(得分:1)

代码实际上完全正常工作。真正的问题是我期待的错误java.lang.UnsatisifiedLinkError不是Exception,而是Error。修改代码以捕获Throwable解决了这个问题。