Java-何时使用固定大小的线程池和可变大小的线程池?
在java ThreadPoolExecutor中,在以下两种不同的场景中会发生什么Java-何时使用固定大小的线程池和可变大小的线程池?,java,threadpoolexecutor,Java,Threadpoolexecutor,在java ThreadPoolExecutor中,在以下两种不同的场景中会发生什么 1) Fixed Size ThreadPool CoreThreadPool size = 5 MaximumThreadPool size = 5 Queue size = unbounded Maximum no.of threads that can run simultaneously=? 2) Variable size ThreadPool CoreThreadPool
1) Fixed Size ThreadPool
CoreThreadPool size = 5
MaximumThreadPool size = 5
Queue size = unbounded
Maximum no.of threads that can run simultaneously=?
2) Variable size ThreadPool
CoreThreadPool size = 5
MaximumThreadPool size = 10
Queue size = unbounded
Maximum no.of threads that can run simultaneously=?
什么时候使用这两种情况?唯一的区别是第二种设置允许您最多运行10个线程;而第一个以5开头;而且永远不会创造更多 当您了解到没有获得更多的性能/吞吐量时,您将使用第一个设置。。。当需要更多线程时。另一方面,请记住,固定大小也意味着:周围总是有5(或10)条线程。从这个意义上说,这种线程池在“静态”环境中最有意义;您的“负载”不会随时间发生重大变化。您不希望5个线程执行对10个线程有利的工作,但也不希望10个线程大部分时间处于空闲状态,因为5个线程就足够了
换句话说:这在很大程度上取决于你的整个设置;在传入流量和许多其他因素上,有多少线程可以为您提供“最佳”结果。因此,当有疑问时,你应该仔细分析;并测试更改一个变量(如最大线程数)会为您更改什么。当然,所有这些都要求您有好的方法来衡量应用程序的性能/行为。我想补充一点,即固定大小的线程池也不会让线程在空闲时死亡。所以一个指标是,如果你期望(几乎)恒定的负载,你会选择固定的大小。如果您希望“突发”和更多线程有助于处理暂时较高的负载,那么您将使用可变大小,因此您只能暂时拥有更多线程,而“正常”负载由较少的线程处理。“如果运行的线程超过corePoolSize,但小于maximumPoolSize,则仅当队列已满时才会创建新线程。”-from。因此,在所示的可变大小线程池设置中,使用无界队列将永远不会获得高于corePoolSize的线程数。