如果它在Servlet的Tomcat容器中运行,是否有必要在某个时刻关闭ExecutorService
。如果是,那么我应该在何处致电关机?我尝试在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();
}
答案 0 :(得分:3)
ExecutorService
背后的想法是重用线程。创建线程很昂贵,通常创建一次线程然后多次使用同一个线程会更有效。这正是ExecutorService
的作用:它管理一个(可能是空闲的)线程池,并在调用其submit
方法时为它们分配工作。
在典型的应用程序中,您不希望关闭ExecutorService
。但是,如果您的申请被终止,您应该正确关闭ExecutorService
。由于您使用的是Spring,因此不必担心:
默认情况下,使用Java配置定义的具有公共关闭或关闭方法的bean会自动使用销毁回调登记。 [见documentation。]
这意味着,如果您关闭ApplicationContext
,Spring会自动为您关闭ExecutorService
。