java - SimpleTimeLimiter 超时 - 关闭应用程序需要很长时间

标签 java timeout guava

我正在使用 Guava 的 SimpleTimeLimiter 来获取超时功能。问题是一旦我使用 SimpleTimeLimiter 关闭应用程序(如果它完成)需要 30 秒(如果我更改超时,这个时间不会改变)。如果我直接调用 new MyCallable().call() 一切正常 - 应用程序在最后一个任务完成后立即关闭。

应用程序本身有一个自己的关闭 Hook ,能够处理 ctrl-c(完成最后一个任务)。该应用程序使用 H2 嵌入式数据库和网络。

我尝试使用 visualvm 进行分析 - 最后的时间没有记录下来?!这段漫长的等待时间发生在我的关闭钩子(Hook)被调用之前(可能是另一个关闭钩子(Hook)?)。

有什么办法解决这个问题吗?

最佳答案

当您使用默认构造函数创建 SimpleTimeLimiter 时 - 他会创建您无法控制的自己的 Executors.newCachedThreadPool(),因此您的应用程序会在所有线程完成之前发生什么.来自 Javadoc

... Threads that have not been used for sixty seconds are terminated and removed from the cache....

如果您创建自己的 ExecutorService 并使用此 executorService 创建 SimpleTimeLimiter,那么您可以在关闭 Hook 上关闭 executorService。

private final ExecutorService executor;
private final TimeLimiter timeLimiter;

...
executor = Executors.newCachedThreadPool();
timeLimiter = new SimpleTimeLimiter(executor);
...

public void shutdown() {
  if (executor == null || executor.isShutdown()) {
    return;
  }
  executor.shutdown();
  try {
    executor.awaitTermination(5, TimeUnit.SECONDS);
  } catch (InterruptedException e) {
    log.log(Level.WARNING, "Interrupted during executor termination.", e);
    Thread.currentThread().interrupt();
  }
  executor.shutdownNow();
}

关于java - SimpleTimeLimiter 超时 - 关闭应用程序需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925802/

相关文章:

arrays - JDK 的数组与 Guava 的 ImmutableList

java - 创建一个类的方法并在主类中调用它

java - 使用 JNDI 从 Java 在 LDAP 中使用 ppolicy 时如何获取特定错误

android - 通过服务保持屏幕开启

c - MPI有超时机制吗?

guava - Jersey 2 客户端 java.lang.NoSuchMethodError : org. glassfish.jersey.CommonProperties.getValue

java - 为什么 struts 资源包具有 myresource.properties 和 myresource_en.properties 文件

java - Apache Mina SSHD - FileZilla 显示错误的目录结构

android - 仅在 Android 而非 iOS 上使用 "Volley"发出的服务器请求超时

java - 使用来自谷歌 Guava 的 Murmur3 生成长唯一 ID