建设通招标网站,pro wordpress theme development,最好的域名注册网站,佛山市专注网站建设平台线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。在代码中通常不会固定线程池的大小,而应该通过某种配置机制来提供,或者根据Runtime. availableProcessors来动态计算。
幸运的是#xff0c;要设置线程池的大小也并不困难#xff0c;只需要避免“过大”和“过…线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。在代码中通常不会固定线程池的大小,而应该通过某种配置机制来提供,或者根据Runtime. availableProcessors来动态计算。
幸运的是要设置线程池的大小也并不困难只需要避免“过大”和“过小”这两种极端情况。如果线程池过大那么大量的线程将在相对很少的CPU和内存资源上发生竞争这不仅会导致更高的内存使用量而且还可能耗尽资源。如果线程池过小那么将导致许多空闲的处理器无法执行工作从而降低吞吐率。
要想正确地设置线程池的大小必须分析计算环境、资源预算和任务的特性。在部署的系统中有多少个CPU?多大的内存?任务是计算密集型、I/O密集型还是二者皆可?它们是否需要像JDBC连接这样的稀缺资源?如果需要执行不同类别的任务并且它们之间的行为相差很大那么应该考虑使用多个线程池从而使每个线程池可以根据各自的工作负载来调整。
对于计算密集型的任务在拥有Nopu个处理器的系统上当线程池的大小为 时通常能实现最优的利用率。(即使当计算密集型的线程偶尔由于页缺失故障或者其他原因而暂停时这个“额外”的线程也能确保CPU的时钟周期不会被浪费。)对于包含I/O操作或者其他阻塞操作的任务由于线程并不会一直执行因此线程池的规模应该更大。要正确地设置线程池的大小你必须估算出任务的等待时间与计算时间的比值。这种估算不需要很精确并且可以通过一些分析或监控工具来获得。你还可以通过另一种方法来调节线程池的大小在某个基准负载下分别设置不同大小的线程池来运行应用程序并观察CPU利用率的水平。
给定下列定义 Usputarget CPU utilization,O≤Uepu≤1
W/C ratio of wait time to compute time
要使处理器达到期望的使用率线程池的最优大小等于 可以通过Runtime 来获得CPU的数目:
int N_CPUS Runtime.getRuntime( ).availableProcessors( );
当然CPU周期并不是唯一影响线程池大小的资源还包括内存、文件句柄、套接字句柄和数据库连接等。计算这些资源对线程池的约束条件是更容易的计算每个任务对该资源的需求量然后用该资源的可用总量除以每个任务的需求量所得结果就是线程池大小的上限。
当任务需要某种通过资源池来管理的资源时例如数据库连接那么线程池和资源池的大小将会相互影响。如果每个任务都需要一个数据库连接那么连接池的大小就限制了线程池的大小。同样当线程池中的任务是数据库连接的唯一使用者时那么线程池的大小又将限制连接池的大小。