public class ApplicationWatch implements ServletContextListener {
private static Logger logger = Logger.getLogger(ArchDataInit.class);
public void contextDestroyed(ServletContextEvent event) {
logger.info(
"start ApplicationWatch contextDestroyed method");
logger.info(
"start shutdown thread pool");
if (ArchConstant.executor != null) {  
  ArchConstant.executor.shutdown();  
  }  
logger.info("end shutdown thread pool");
}

上面的这段代码是在servlet级别销毁线程池。

public class DestroyThreadPoolWhenShutApp implements DisposableBean{
	private static Logger logger = Logger.getLogger(DestroyThreadPoolWhenShutApp.class);
	public void destroy() throws Exception {
		logger.info("start ApplicationWatch contextDestroyed method");
		logger.info("start shutdown thread pool");
		if (ArchConstant.executor != null) {
			ArchConstant.executor.shutdown();
		}
		logger.info("end shutdown thread pool");
	}
}

上面的这行代码是在spring级别销毁线程池

  <!-- 在关闭应用的时候销毁线程池  -->  <bean id="destroyThreadPool" class="com.giantstone.arch.datainit.DestroyThreadPoolWhenShutApp"/>

然后在spring配置文件中创建一个bean级别的销毁bean.

这样是因为,在spring 关闭的时候,它先执行的是bean级别的类,然后再执行它自己的销毁方法(依据文档得知)。