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

时间:2013-11-12 09:48:16

标签: java timeout guava

我正在使用Guava的SimpleTimeLimiter来获取Timeout功能。问题是,当我使用SimpleTimeLimiter时,关闭应用程序(如果已完成)需要30秒(如果我更改超时,则此时间不会更改)。如果我直接调用new MyCallable().call()所有工作正常 - 应用程序会在上一个任务完成后立即关闭。

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

我尝试使用visualvm进行配置文件 - 最后的时间没有记录?!这个漫长的等待期是在调用我的关闭钩子之前进行的(可能是另一个关闭钩子?)。

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

1 个答案:

答案 0 :(得分: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();
}