设置线程池大小
要想正确地设置线程池的大小,必须分析计算环境、资源预算和任务的特性。在部署的系统中有多少个CPU?多大的内存?任务是计算密集型、I/O密集型还是二者皆可?它们是否需要像JDBC连接这样的稀缺资源?如果需要执行不同类别的任务,并且它们之间的行为相差很大,那么应该考虑使用多个线程池,从而使每个线程池可以根据各自的工作负载来调整。
对于计算密集型的任务,在拥有Ncpu个处理器的系统上,当线程池的大小为Ncpu+1个时,通常能实现最优的利用率。(即使当计算密集型的线程偶尔由于页缺失故障或者其他原因而暂停时,这个“额外”的线程也能确保CPU的时钟周期不会被浪费)。对于包含I/O操作或者其他阻塞操作的任务,由于线程并不会一直执行,因此线程池的规模应该更大。要正确地设置线程池的大小,你必须估算出任务的等待时间与计算时间的比值。这种估算不需要更精确,并且可以通过一些分析或监控工具来获得。你还可以通过另一种方法来调节线程池的大小:在某个基准负载下,分别设置不同大小的线程池来运行应用程序,并观察CPU利用率的水平。
给定下列定义:
要使处理器达到期望的使用率,线程池的最优大小等于:
可以通过Runtime来获得CPU的数目:
int N_CPUS = Runtime.getRunTime().availableProcessors();
当然,CPU周期并不是唯一影响线程池大小的资源,还包括内存、文件句柄、套接字句柄和数据库连接等。计算这些资源对线程池的约束条件是更容易的:计算每个任务对该资源的需求量,然后用该资源的可用总量除以每个任务的需求量,所得的结果就是线程池大小的上限。
当任务需要某种通过资源池来管理的资源时,例如数据库连接,那么线程池和资源池的大小将会互相影响。如果每个任务都需要一个数据库连接,那么连接池的大小就限制了线程池的大小。同样,当线程池中的任务是数据库连接的唯一使用者时,那么线程池的大小又将限制连接池的大小。
相关推荐
Java JDK 7是Java开发工具包的一个重要版本,它的全称是Java Development Kit,是用于构建和运行Java应用程序的关键组件。这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些...
Java精华学习笔记主要涵盖了Java编程语言的核心概念、关键特性以及实战技巧。这些笔记是作者在深入学习Java过程中积累的经验总结,旨在帮助初学者快速...通过深入学习和实践,可以逐步精通Java编程,应对各种开发挑战。
【Java狂神说笔记】是针对Java开发语言深入学习的一份综合笔记,涵盖了广泛的Java相关知识点,适合初学者和有一定经验的开发者进行提升。这份笔记的PDF版本详细讲解了Java的基础概念、进阶特性和实战应用,旨在帮助...
Java是一种广泛使用的面向对象的编程...通过系统学习和实践,初学者可以逐步掌握Java编程,为后续的软件开发和系统设计打下坚实的基础。在阅读笔记时,结合实际编写代码,不断练习和调试,是提升Java技能的最佳途径。
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
Java JDK 7(Java Development Kit 7)是Java编程语言的一个重要版本,由Sun Microsystems(后被Oracle公司收购)开发,并于2011年7月28日正式发布。这个版本引入了一系列新特性、改进和优化,旨在提升开发者的工作...
理解线程的并发执行、同步机制(如synchronized关键字和Lock接口)以及线程通信,对于开发高效并行程序非常重要。 九、反射与注解 反射机制允许在运行时动态地获取类的信息并操作类的对象。注解是一种元数据,用于...
反射机制在Java中的应用广泛,特别是在框架开发和各种底层API中。 类集框架是Java集合框架的简称,提供了表示和操作集合的接口和类。Java集合框架主要包括Collection接口和Map接口,以及它们的多个子接口和实现类。...
Java JDK 8是Java开发工具集的一个重要版本,它的发布带来了许多创新特性和改进,极大地提升了开发者的工作效率。本学习笔记旨在深入解析JDK 8的关键特性,帮助初学者快速掌握这一版本的核心知识。 1. **lambda...
标题“java8学习笔记”表明了这是一份关于Java 8版本的学习资料,Java 8是Java编程语言的一个重要版本,它在2014年发布,包含了许多新的特性,例如lambda表达式、新的日期时间API、Stream API、接口中的默认方法和...
Java中的线程是程序执行流的最小单位,提供并行计算的能力。Thread类用于表示线程,可以通过创建Thread类的子类或实现Runnable接口来创建线程。 JDK的安装和配置对于Java开发至关重要。路径(PATH)和类路径...
10. **并发改进**:包括`ForkJoinPool`和`RecursiveAction`的引入,它们是Java并行计算框架的一部分,支持高效的并行任务执行。 学习Java JDK 7,不仅可以帮助你理解这个版本的特性和改进,还能让你更好地适应后续...
涵盖了Java的各个方面,包括但不限于IO流(模拟生活中的数据传输)、线程(如同生活中的并行任务)、网络编程(如互联网上的通信)以及Java的库和框架(如Spring框架在软件开发中的角色,就像生活中的基础设施,简化...
本笔记将深入探讨这两个区域的工作原理以及如何进行有效的分析。 首先,我们要理解Java内存的两个主要部分:堆(Heap)和栈(Stack)。堆主要用于存储对象实例,而栈则用于存储基本类型变量和对象引用。堆内存是...
Java大数据课程核心笔记是针对那些想要深入理解和应用Java在大数据领域的开发者所准备的宝贵资源。这份笔记涵盖了Java的基础以及在大数据处理中的应用,适合不同层次的学习者,无论你是初入编程殿堂的新手,还是有着...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。这份"随时更新-小白实习生的Java学习笔记.rar"压缩包包含了实习生在学习Java过程中积累的知识点,主要涵盖了Java的基础、数据库操作、多...
在Java JDK 8中,引入了一系列重大更新,极大地提升了开发效率和代码的可读性。首先,书中会详细讲解Lambda表达式,这是Java 8的核心特性之一。Lambda允许将匿名函数作为方法参数传递,简化了多线程编程和事件处理,...
【Java高并发笔记】 在Java开发中,处理高并发场景是一项关键技能,涉及到多个核心概念。以下是关于同步、异步、并发、并行、临界区、阻塞、非阻塞以及死锁、饥饿和活锁的详细解释。 1. **同步与异步** - **同步*...