2010-09-29 56 views
1

在我的应用程序中,我使用ExecutorService进行异步调用。在使用ExecutorService时“刷新”固定大小的线程池

ExecutorService executorService = Executors.newFixedThreadPool(10); 

我只在应用程序(基于web)关闭时关闭executorService。最近在调试一些问题时,我正在查看这段代码,并想知道当我强制关闭ExecutorService并重新启动它时,在程序执行过程中是否会出现这种情况,即新的池式线程集。所以我想知道典型的场景/意想不到的应用行为会迫使我这样做?

我检查的典型例外是ExecutionException, InterruptedException, CancellationException,但除记录它们之外,我没有做太多的工作。

+0

你问是否有服务引发的异常表明你需要“重新启动”它吗?或者你是否问过在外部应用程序行为期间是否需要重新启动执行程序服务?你是否看到似乎表明执行程序服务中的线程不再运行的行为? – Gray 2010-09-29 15:00:35

回答

1

一般的答案是,你不应该回收池;它旨在最大限度地减少您的需要。您可能要考虑两种情况:

  • 在你的任务之一突然的未处理的异常。在这种情况下,任务将失败(并且您可以选择通过线程池钩子捕获未处理的异常,或者可以退出工作线程)。但是,线程池可以干净地处理这个问题,并且如果需要,下一个到线程池的请求将创建一个替换。

  • 工作线程死锁。这一点不容易预测或检测 - 我无法想象构建一个应用程序围绕回收线程池来应对死锁的工作线程。

除了这两个边缘条件,我没有理由担心定期循环到新的线程池。

有些人创建和销毁线程池,因为他们不知道的CompletionService,方便的方法,如invokeAll()和监控完成与Future S上的灵活性。