gpt4 book ai didi

java - 如何在 Tomcat 停止时停止执行程序线程?

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:43 26 4
gpt4 key购买 nike

我通过创建固定数量的线程来使用执行程序服务来执行 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 停止时,我们得到这个错误:

SEVERE: The web application [/viewer] appears to have started a thread named [ThreadExecutor_5161616156] but has failed to stop it. This is very likely to create a memory leak.

这是一个真正的问题吗?如果没有这些服务错误,我该怎么做才能正确停止 tomcat。

最佳答案

这是一个真正的问题。由您的执行程序汇集的非守护线程不会自行消失,如果您不对执行程序调用关闭,那么线程将保持 Activity 状态并防止 JVM 退出。

制作一个 ServletContextListener,它在 contextDestroyed 上调用您的执行器上的关闭。

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

关于java - 如何在 Tomcat 停止时停止执行程序线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com