当前位置: 首页 > 知识库问答 >
问题:

当Tomcat停止时,如何停止执行器线程?

陆臻
2023-03-14

我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。

executorService = ExecutorServiceFactory.getInstance().getExecutorService(Config.getInstance().getNumberOfThreads(), "ThreadExecutor_"+UIDFactory.getInstance().createSessionID());
executorService.execute(new Retrieve(data));

private class Retrieve implements Runnable{
    private Vector<String> data;

    public WADORetrieve(Vector<String> data) {          
            this.data = data;
    }

    @Override
    public void run() {
        for(int i=0;i<data.length;i++){
            fetch(data[i]);
        }
    }
}    

当Tomcat停止时,我们会出现以下错误:

严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。

这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

共有1个答案

薛涛
2023-03-14

这真是个问题。执行器汇集的非守护进程线程不会自行消失,如果不调用执行器上的shutdown,那么线程将保持活动状态,并阻止JVM退出。

制作一个ServletContextListener,在ContextDistromed上对执行器调用shutdown。

或者,您可以让ThreadFactory守护进程线程返回线程,以便在最后一个非守护进程线程终止时退出。由于您正在进行数据检索,因此最好避免这种情况,因为这样可能会导致数据库资源未关闭。

 类似资料:
  • 问题内容: 直到最近,当一个人正在处理一堆容器并且其中一个启动的容器停止时,所有容器都停止了。自从https://github.com/docker/compose/issues/741以来,情况就不再如此了,这对我们来说真的很烦人:我们使用docker- compose运行selenium测试,这意味着启动应用程序服务器,启动selenium hub +节点,启动测试驱动程序,然后在测试驱动程序

  • 问题内容: 我使用以下代码在Python中启动并关闭 在脚本结束执行后,我仍然在Mac活动监视器中找到的实例。实际上,每次我运行脚本时,都会创建一个新进程。 我应该如何关闭驱动程序? 问题答案: 不保证该方法释放与驱动程序实例关联的所有资源。请注意,这些资源包括但不限于驱动程序可执行文件(在这种情况下为PhantomJS)。该方法旨在释放驱动程序的所有资源,包括退出可执行进程。

  • motioncfp.java:

  • 我有一个父pom,它为我的其他组件提供所需的版本号变量 您必须使用分类器将补充工件附加到项目中,而不是替换它们 我发现这是因为jar打包固有的maven jar插件默认绑定,但我正在进行war打包,所以在war打包之后,默认jar执行开始并抛出上面的一个。任何停止违约的解决方案都将帮助我提前感谢。

  • 这是我的一部分代码。好吧,我的问题是,当我输入错误的值时,如何跳过catch块?例如,正如你们所看到的,我需要坐标为双精度或浮点,但当我输入字符串时,它在循环时开始无限大。在用户输入正确的值之前,如何防止它并使程序从头开始? 这是我的代码,没有循环和标签。在正确的数据输入之前,我如何才能使代码工作

  • 问题内容: 我有以下代码: 在发生某些事件之后,我应该停止在的方法中声明的操作,该方法实现。 我怎样才能做到这一点?我无法关闭执行器,只能撤消我的定期任务。我可以用吗?如果可以的话,请告诉我它将如何工作。 问题答案: 使用。该是你的任务的处理。您需要取消此任务,它将不再执行。 实际上,是签名,并将其与参数一起使用将导致当前正在运行的执行线程被调用中断。如果线程在阻塞的可中断调用(例如)中等待,则会