用于ExecutorService时,“刷新”固定大小的线程池

时间:2010-09-29 07:28:38

标签: java multithreading concurrency

在我的应用程序中,我使用ExecutorService进行异步调用。

ExecutorService executorService = Executors.newFixedThreadPool(10);

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

我检查的典型例外是ExecutionException, InterruptedException, CancellationException,但除了记录它们之外,我做的并不多。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

有些人创建和销毁线程池,因为他们不知道CompletionService,方便的方法,如invokeAll(),以及使用{{监控完成的灵活性1}}秒。