【问题标题】:"Refreshing" a fixed size thread pool when using for a ExecutorService用于 ExecutorService 时“刷新”固定大小的线程池
【发布时间】:2010-09-29 07:28:37
【问题描述】:

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

ExecutorService executorService = Executors.newFixedThreadPool(10);

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

我检查的典型异常是ExecutionException, InterruptedException, CancellationException,但除了记录它们之外我没有做太多事情。

【问题讨论】:

  • 你是在问服务是否有抛出异常提示你需要“重启”它?或者您是否在问是否有在外部应用程序行为期间需要重新启动执行程序服务的情况?您是否看到似乎表明执行程序服务中的线程不再运行的行为?

标签: java multithreading concurrency


【解决方案1】:

一般的答案是您不必回收池;它旨在最大限度地减少您这样做的需要。您可能会考虑的两种情况是:

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

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

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

有些人确实创建和销毁线程池,因为他们不知道CompletionServiceinvokeAll() 等便利方法以及使用Futures 监视完成的灵活性。

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2016-09-01
    • 2018-05-10
    • 2011-02-19
    • 2019-11-08
    • 1970-01-01
    • 2014-08-01
    • 2010-11-20
    相关资源
    最近更新 更多