当前位置: 首页 > 面试题库 >

在webapp中正常关闭ExecutorService?

易弘亮
2023-03-14
问题内容

在我的webapp中,我创建了一个ExecutorService使用固定大小的ThreadPool的服务。我ExecutorService在整个应用程序生命周期中都重复使用了相同的代码。

private static ExecutorService pool = Executors.newFixedThreadPool(8);

所有人都在Tomcat中运行,这在关闭时给我以下错误:

appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak.

我确实意识到我需要在关闭tomcat之前先关闭ExecutorService。Soms SO线程已经在谈论这一点,但是我找不到一种干净的方法来解决这个问题。

是否应该ShutdownHook在正常关闭线程和执行器的情况下使用建议的@ Tim-bender ?还是应该改用CachedThreadPool?


问题答案:

在Tomcat中,关闭挂钩不是一个好方法,因为:

  • 它将关闭池太晚(在关闭时),Tomcat已经警告您未关闭资源

  • 您实际上想在取消部署应用程序时关闭该池,以便重新部署有效(否则,每个应用程序都会创建新池,并且只有在完全关闭时它们才会关闭)

  • 关闭线程池可能需要一些时间(请参见下文),关闭钩子应尽可能快

更好的地方是ServletContextListener.contextDestroyed()。记住,您既shutdownNow()要缓冲池(取消运行并拒绝新任务),又要awaitTermination()等待已经运行的任务完成并且所有线程都停止。



 类似资料:
  • 在我的webapp中,我创建了一个使用具有固定大小线程池的的服务。我在整个应用程序生命周期中重用相同的。 All在Tomcat中运行,在关闭时出现以下错误: 我确实意识到在关闭tomcat之前需要关闭ExecutorService。Soms所以线程已经谈到了这一点,但我找不到一个干净的方法来处理这一点。 我是否应该使用,就像@tim-bender建议的那样,在优雅地关闭线程和执行器?还是应该使用C

  • 问题内容: 我目前在关闭应用程序的CTRL-C期间关闭异步协程时遇到问题。下面的代码是我现在所拥有的简化版本: 如果按CTRL-C,会给我以下输出: 我对asyncio的经验不是很丰富,所以我很确定我在这里缺少重要的东西。真正让我头疼的是输出之后的部分。从开始,我必须承认我不知道发生了什么。我查看了其他问题,但无法正常工作。那么,为什么这段代码输出类似的东西?如何干净地关闭协程呢? 谢谢你的帮助!

  • 问题内容: 这是我正在使用的简单网络服务器 除了保持活力外,效果很好。当第一个请求进入时,被调用。但是过程并没有结束。实际上,TCP连接仍处于打开状态,这允许另一个请求通过,这是我试图避免的。 如何关闭现有的保持活动连接? 问题答案: 您可以调用响应回调。这将关闭请求连接。 由于没有什么可做的,它也将结束您的过程,最终结果与在那里进行调用相同。

  • 问题内容: 当我运行以下脚本时,两个lambda都在同一文件junk.txt上运行os.startfile()。我希望每个Lambda都使用创建Lambda时设置的值“ f”。有没有办法让它按我的预期运行? 问题答案: 一种方法是执行此操作: 否则,在调用该函数时将进行查找,因此您将获得当前(循环后)的值。 我更喜欢的方式: 甚至(在python 2.5+中):

  • 在一个实用程序库中,我正在创建一个执行器服务 然后,主线程将向该服务发布一些任务。当主线程完成时,我想关闭Executor服务,以允许应用程序退出。 问题是我只能更改实用程序库中的代码。我考虑的一个选项是使用守护线程。但在发布到该服务的任务完成之前,它会突然关闭。

  • 我正在学习Spring Core认证,在提供的学习材料中,我对这个问题有一些疑问: 关闭应用程序上下文的首选方法是什么? 我知道如果我有这样的东西: 通过在上下文对象上使用close()方法,ApplicationContext被关闭,应用程序被销毁。 但我认为这不是我必须做的最好的方式。 阅读官方留档,我发现我也可以这样做: 在JVM中注册一个关闭挂钩,因此JVM将在JVM退出之前触发Sprin