2

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

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

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

任何想法如何解决这一问题?

4

1 回答 1

1

当您SimpleTimeLimiter使用默认构造函数创建时 - 他创建Executors.newCachedThreadPool()了您无法控制的自己,因此您的应用程序将完成所有线程。来自 Javadoc

... 60 秒内未使用的线程将被终止并从缓存中删除....

如果您创建自己的 ExecutorService 并使用此 executorService 创建 SimpleTimeLimiter,那么您可以在关闭挂钩上关闭 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();
}
于 2017-02-28T18:24:03.677 回答