How to stop an executor thread when Tomcat is stopped?

回眸只為那壹抹淺笑 提交于 2019-11-26 21:28:00

问题


I am using an executor service by creating a fixed number of threads to do a HTTP GET data retrieval.

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]);
        }
    }
}    

When Tomcat is stopped we get this error:

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.

Is this a real issue? What can I do to stop tomcat properly without these service errors.


回答1:


It's a real problem. Non-daemon threads pooled by your executor don't go away by themselves, if you don't call shutdown on the executor then the threads will stay alive and prevent the JVM from exiting.

Make a ServletContextListener that calls shutdown on your executor on contextDestroyed.

Alternatively you could make the threads returned by your ThreadFactory daemon threads, so that they would exit when the last non-daemon thread terminates. Since you're doing data retrieval it would seem better to avoid this since it could leave database resources unclosed.



来源:https://stackoverflow.com/questions/35996274/how-to-stop-an-executor-thread-when-tomcat-is-stopped

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!