是否有必要为在Tomcat容器中运行的Web应用程序关闭ExecutorService?

Diy*_*kir 6 java tomcat executorservice

ExecutorService如果它在Servlet的Tomcat容器中运行,是否有必要在某个时刻关闭它.如果是,那么我应该在何处致电关机?我尝试在submit()调用之后添加它,但是当我从客户端浏览器向Servlet发出另一个请求时,我得到一个RejectedExecutionException可能是因为我关闭了?我试图了解它如何在Tomcat中的Servlet中工作以及我应该如何使用它.

我在我的webApplication中执行以下操作(它似乎工作正常,没有任何关闭):

// In configuration class
@Bean (name = "executorService")
public ExecutorService executorService() {
  return Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
}

// In some other class
@Qualifier("executorService")
@Autowired
private ExecutorService executorService;
....
private void load() {
  executorService.submit(new Runnable() {
    @Override
    public void run() {
        doSomethingInTheBackground();
    }
});

// If I enable this I will get a RejectedExecutionException 
// for a next request.
// executorService.shutdown();
Run Code Online (Sandbox Code Playgroud)

}

hzp*_*zpz 7

背后的想法ExecutorService是重用线程。创建线程的开销很大,通常创建一个线程一次然后多次使用同一个线程效率更高。这正是 anExecutorService所做的:它管理一个(可能空闲的)线程池,并在您调用其submit方法时为它们分配工作。

因此,在典型的应用程序中,您不想关闭ExecutorService. 但是,ExecutorService如果您的应用程序终止,您应该正确关闭。由于您使用的是 Spring,因此您不必担心:

默认情况下,使用具有公共关闭或关闭方法的 Java 配置定义的 bean 会自动加入销毁回调。[请参阅文档。]

这意味着,如果您关闭ApplicationContext,Spring 将自动ExecutorService为您关闭。