首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭ExecutorService

关闭ExecutorService
EN

Stack Overflow用户
提问于 2009-09-16 07:55:29
回答 3查看 3.2K关注 0票数 10

在Tomcat中,我编写了一个ServletContextListener,它将在启动时启动ExecutorService,并在卸载时终止它。

我正在遵循ExecutorService的javadoc中的示例。

代码语言:javascript
复制
public void contextDestroyed( ServletContextEvent sce )
{
    executor.shutdown();
    try
    {
        executor.awaitTermination( 50, TimeUnit.SECONDS );
    }
    catch( InterruptedException ie )
    {
        Thread.currentThread().interrupt();
    }
}

我的问题是,我应该在contextDestroyed()方法中传播InterruptedException吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-16 07:58:49

我会说不是。contextDestroyed方法由容器调用,作为上下文即将被拆除的通知,它不会询问您的许可。此外,Javadoc没有定义抛出异常时会发生什么,因此结果可能是不可预测的和/或不可移植的。

我要做的是在catch块中调用executor.shutdownNow()来强制终止executor (即“你有机会,现在停止”)。

票数 5
EN

Stack Overflow用户

发布于 2009-09-16 07:58:54

您的代码示例中包含的内容(重新中断当前线程)正是我所推荐的。Tomcat中的某个东西在您自己的代码之外发送了原始中断,所以让Tomcat有机会处理它。

我不知道Tomcat会用InterruptedException做什么。它是不确定的。但是Tomcat发起了中断,并且Tomcat拥有contextDestroyed(...)方法正在运行。这里适用的"Java并发实践“中的一般原则是:线程的创建者负责处理线程生命周期问题。

处理中断肯定是一个生命周期问题。

票数 1
EN

Stack Overflow用户

发布于 2010-10-27 15:59:11

我同意Steve的观点,重置中断标志会让您无法控制的代码有机会对事件做出反应。

tempus-fugit提供了一种方便的方法来为你做这件事,如果事情花的时间太长,还有一个显式的超时异常。

代码语言:javascript
复制
waitOrTimeout(shutdown(executor), timeout);

看看文档的并发部分是否感兴趣……Tempusfugitlibrary.org/文档

这个example演示了它的用法,包括等待完成和更激进的关闭。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1431573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档