For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
线程池的设置与应用在许多软件编程开发项目中都是会经常用到的一个编程技术,而本文我们就通过案例分析来简单了解一下,线程池设置需要注意哪些问题。
耗时的任务,设置超时时间
如果你的线程池不够大,又有很多耗时的任务,这会影响服务的响应性.这时候你可以限定任务等待资源的时间,而不是无限制地等下去.
耗时的任务可能会死锁或者响应的很慢
大多数平台类库中的阻塞方法,都有限时和非限时两个版本.例如Blocking.put.如果超时你可以把任务标记为失败,终止或者把他重新返回队列,准备之后执行.这样无论每个任务的终结果是成功还是失败,都保证了任务会向前发展,这样可以更快地将线程从任务中解放出来.(如果线程池频频被阻塞的任务充满,这同样可能是池太小的一个信号).
定制线程池的大小
不要硬编码线程池的大小
线程池合理的长度取决于未来提交的任务类型和所部属系统的特征.池的长度应该由某种配置机制来提供,或者利用Runtime.availableProcessors(获取你电脑的处理器数量),动态进行计算
线程池过大&过小的坏处
线程池过大:线程对稀缺的CPU和内存资源的竞争,会导致内存的高使用量.线程间切换也会消耗资源
线程池过小:由于存在很多可用的处理器资源没用,会对吞吐量造成损失
制定线程池大小依据的内容
正确的定制线程池的长度,需要理解你的计算环境、资源预算和任务的自身特性.
部署系统中安装了多少个CPU?多少内存?任务主要执行的是计算、I/O还是一些混合操作?它们是否需要像JDBCConnection这样的稀缺资源?
如果你有不同类别的任务,它们拥有差别很大行为,那么请考虑使用多个线程池,这样每个线程池可以根据不同任务的工作负载进行调节.
计算密集型和I/O密集型的线程选择
计算密集型:一直在计算,cpu利用率高,过多的线程没有意义,反而切换线程会消耗额外的资源.
I/O密集型:例如查找数据库,等待数据造成的阻塞,CPU利用率低,多个线程可以提高响应速度.
对于计算密集型的任务,一个有N个处理器的系统通常使用一个N+1个线程的线程池来获得优的利用率(计算密集型的线程恰好在某时因为发生一个页错误或者因其它原因而暂停,刚好有一个"额外"的线程,可以确保在这种情况下CPU周期不会中断工作).
对于包含了I/O和其他阻塞操作的任务,不是所有的线程都会在所有的时间被调度,因此你需要一个更大的池.
在一个基准负载下,可以使用不同大小的线程池运行你的应用程序,并观察CPU利用率的水平.
线程池的长度和资源池的长度互相影响
当任务需要使用池化的资源时,比如数据库链接,线程池的长度和资源池的长度会互相影响.
如果每一个任务都需要一个数据库链接,那么连接池的大小就限制了线程池的有效大小;类似地,当线程池中的任务是连接池的消费者时,那么线程池的大小反而又会限制了连接池的有效大小.
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。