java - 发生异常时,ExecutorService runnable 从不点击尝试

标签 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 上下文是线程绑定(bind)的。如果连接到 LWJGL 的时间太长,那么返回的 future 将提前脱离自身。

问题是在单元测试中,这绝对是顺畅的。但是,当我尝试调试程序时,对任何 display 的任何调用方法导致 lwjgl 抛出一个真正的异常(因为我的 lwjgl 库没有链接。这仍然作为 LwjglException 抛出,尽管如此)。由于某种原因,此异常并未从此处代码中的 try-catch 中获取,而是被吞噬了; future永远不会异常完成。

所以在某处,我的异常被这段代码吞没了。

注意:display只是 LWJGL 的 Display 的一个接口(interface)- 那里没有花哨的魔法。 scheduledExecutorService是单线程计划执行器。

我也很感激 .submit()schedulescheduledExecutorService都返回 Future<T>但这缺少我想从 CompletableFuture<T> 使用的构图.如果可能的话,我希望能够继续使用它。

最佳答案

代码实际上完全按照它应该的方式工作。真正的问题是我预期的错误 java.lang.UnsatisifiedLinkError,不是 Exception 而实际上是 Error。修改代码以捕获 Throwable 可以解决此问题。

关于java - 发生异常时,ExecutorService runnable 从不点击尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29056439/

相关文章:

java - 使用 Java 中的 LWJGL 进行基于浏览器的 3D 游戏

java - LWJGL 不会读取键盘输入

java - 在动态 TableView 中编辑单元格值?

java - Java中ConcurrentHashMap的查询

javascript - 从 JavaScript (Rhino/Nashorn) 中添加和删除 Jar 文件和类

java - 如何使用 Java 8 Stream 映射和收集原始返回类型

java - 尝试使用 Maven 导入 o​​racle jdbc7 驱动程序时出错

scala - 需要 Java 8 才能使用 Maven 构建 Scala 项目

java - 如果端点是 https,是否使用 HTTPS

java - Mac OS X 上的 libGDX 小程序无法加载 libgdx.dylib