配置Java线程池时,如何避免将常见误区变成难以纠正的长期问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3043个文字,预计阅读时间需要13分钟。
前言:由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程池在各种语言内都得到了实践。在Java语言中,线程池是非常重要的一个部分,Doug Lea大神的线程池更是其中的佼佼者。
前言
由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程的池化在各种语言内都有实践,当然在 Java 语言中线程池是也非常重要的一部分,有 Doug Lea 大神对线程池的封装,我们使用的时候是非常方便,但也可能会因为不了解其具体实现,对线程池的配置参数存在误解。
我们经常在一些技术书籍或博客上看到,向线程池提交任务时,线程池的执行逻辑如下:
当一个任务被提交后,线程池首先检查正在运行的线程数是否达到核心线程数,如果未达到则创建一个线程。
如果线程池内正在运行的线程数已经达到了核心线程数,任务将会被放到 BlockingQueue 内。
如果 BlockingQueue 已满,线程池将会尝试将线程数扩充到最大线程池容量。
如果当前线程池内线程数量已经达到最大线程池容量,则会执行拒绝策略拒绝任务提交。
流程如图(摘自美团技术博客):
流程描述没有问题,但如果某些点未经过推敲,容易导致误解,而且描述中的情境太理想化,如果配置时不考虑运行时环境,也会出现一些非常诡异的问题。
本文共计3043个文字,预计阅读时间需要13分钟。
前言:由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程池在各种语言内都得到了实践。在Java语言中,线程池是非常重要的一个部分,Doug Lea大神的线程池更是其中的佼佼者。
前言
由于线程的创建和销毁对操作系统来说都是比较重量级的操作,所以线程的池化在各种语言内都有实践,当然在 Java 语言中线程池是也非常重要的一部分,有 Doug Lea 大神对线程池的封装,我们使用的时候是非常方便,但也可能会因为不了解其具体实现,对线程池的配置参数存在误解。
我们经常在一些技术书籍或博客上看到,向线程池提交任务时,线程池的执行逻辑如下:
当一个任务被提交后,线程池首先检查正在运行的线程数是否达到核心线程数,如果未达到则创建一个线程。
如果线程池内正在运行的线程数已经达到了核心线程数,任务将会被放到 BlockingQueue 内。
如果 BlockingQueue 已满,线程池将会尝试将线程数扩充到最大线程池容量。
如果当前线程池内线程数量已经达到最大线程池容量,则会执行拒绝策略拒绝任务提交。
流程如图(摘自美团技术博客):
流程描述没有问题,但如果某些点未经过推敲,容易导致误解,而且描述中的情境太理想化,如果配置时不考虑运行时环境,也会出现一些非常诡异的问题。

