在Tomcat中,我编写了一个ServletContextListener,它将在启动时启动ExecutorService,并在卸载时终止它。
我正在遵循ExecutorService的javadoc中的示例。
public void contextDestroyed( ServletContextEvent sce )
{
executor.shutdown();
try
{
executor.awaitTermination( 50, TimeUnit.SECONDS );
}
catch( InterruptedException ie )
{
Thread.currentThread().interrupt();
}
}我的问题是,我应该在contextDestroyed()方法中传播InterruptedException吗?
发布于 2009-09-16 07:58:49
我会说不是。contextDestroyed方法由容器调用,作为上下文即将被拆除的通知,它不会询问您的许可。此外,Javadoc没有定义抛出异常时会发生什么,因此结果可能是不可预测的和/或不可移植的。
我要做的是在catch块中调用executor.shutdownNow()来强制终止executor (即“你有机会,现在停止”)。
发布于 2009-09-16 07:58:54
您的代码示例中包含的内容(重新中断当前线程)正是我所推荐的。Tomcat中的某个东西在您自己的代码之外发送了原始中断,所以让Tomcat有机会处理它。
我不知道Tomcat会用InterruptedException做什么。它是不确定的。但是Tomcat发起了中断,并且Tomcat拥有contextDestroyed(...)方法正在运行。这里适用的"Java并发实践“中的一般原则是:线程的创建者负责处理线程生命周期问题。
处理中断肯定是一个生命周期问题。
发布于 2010-10-27 15:59:11
我同意Steve的观点,重置中断标志会让您无法控制的代码有机会对事件做出反应。
tempus-fugit提供了一种方便的方法来为你做这件事,如果事情花的时间太长,还有一个显式的超时异常。
waitOrTimeout(shutdown(executor), timeout);看看文档的并发部分是否感兴趣……Tempusfugitlibrary.org/文档
这个example演示了它的用法,包括等待完成和更激进的关闭。
https://stackoverflow.com/questions/1431573
复制相似问题