在我的应用程序中,我使用ExecutorService进行异步调用。
ExecutorService executorService = Executors.newFixedThreadPool(10);
我只在应用程序(基于Web)关闭时才关闭executorService。最近在调试一些问题时,我正在查看这段代码,并想知道在执行程序时是否会出现这种情况,因为我被迫关闭ExecutorService并重新启动它,即新的池化线程集。所以我想知道什么样的典型场景/意外的应用程序行为会迫使我这样做?
我检查的典型例外是ExecutionException, InterruptedException, CancellationException
,但除了记录它们之外,我做的并不多。
答案 0 :(得分:1)
一般的答案是你不应该回收游泳池;它旨在最大限度地减少您的需要。您可能会考虑的两种情况是:
您的某个任务中突然出现未处理的异常。在这种情况下,任务将失败(并且您可以选择通过线程池挂钩或UncaughtExceptionHandler
捕获未处理的异常),并且工作线程可能会退出。但是,线程池会干净地处理这个问题,如果需要,下一个进入线程池的请求将创建一个替换。
工作线程死锁。这个不容易预测或检测 - 我无法想象围绕回收线程池构建应用程序以应对死锁的工作线程。
除了这两个边缘条件之外,我认为没有理由担心定期循环到新的线程池。
有些人做创建和销毁线程池,因为他们不知道CompletionService
,方便的方法,如invokeAll()
,以及使用{{监控完成的灵活性1}}秒。