我的代码有一个使用ExecutorService
固定线程池实现的线程池。池执行的大多数任务都很短,但有时有一个任务会运行很长时间,大约 20-30 秒。此任务运行时,不会执行新任务,只有在长时间运行的任务完成后才会恢复。
池设置为 20,所以这不是问题,因为我可以只运行 2 个线程来重新创建它,第一个是长时间运行的,第二个被卡住了。
我一直在琢磨为什么它被卡住了,然后我切换newFixedThreadPool()
到newCachedThreadPool()
并且瓶颈被释放了。这是我所做的唯一改变。
这种行为有意义吗?代码似乎运行良好,所以我想我会保留更改,据我所知,如果您正在运行许多短任务,最好使用缓存线程池,但我想知道为什么固定池会挂起并且在那里有办法解决吗?
此外,如果有的话,从固定切换到缓存可能会产生什么副作用?
谢谢。