Java中线程池ThreadPoolExecutor的主要处理流程

Java中线程池ThreadPoolExecutor的主要处理流程_第1张图片 

Java中线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发的过程中,合理的使用线程池能够带来以下好处:

1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。

3、提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配、调优和监控。

  对于Java中的线程池ThreadPoolExecutor,当它接收到一个任务时,是怎么处理这个任务的呢?首先看一下源码中ThreadPoolExecutor的execute()方法:

Java中线程池ThreadPoolExecutor的主要处理流程_第2张图片

Java中线程池ThreadPoolExecutor的主要处理流程_第3张图片

  从源码中大概能判断出,当提交一个新任务到线程池中时,线程池的处理流程如下:

1、线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。
2、线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
3、线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

示意图如下:

Java中线程池ThreadPoolExecutor的主要处理流程_第4张图片

Java中线程池ThreadPoolExecutor的主要处理流程_第5张图片

所以,ThreadPoolExecutor执行execute方法分下面4种情况:

1、如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(执行这一步骤需要获取全局锁)。
2、如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。
3、如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(执行这一步骤需要获取全局锁)
4、如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用
RejectedExecutionHandler.rejectedExecution()方法。

关于线程池的创建,根据ThreadPoolExecutor的构造函数我们可以得知:

Java中线程池ThreadPoolExecutor的主要处理流程_第6张图片

这几个参数的含义是:

1、corePoolSize:线程池的基本大小,当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。

2、maximumPoolSize:线程池的最大数量,如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。

3、keepAliveTime:线程活动保持时间,线程池的工作线程空闲后,保持存活的时间。所以,如果任务很多,并且每个任务执行的时间比较短,可以调大时间,提高线程的利用率。

4、TimeUnit unit:线程活动保持时间的单位。

5、BlockingQueue workQueue:任务队列,用于保存等待执行的任务的阻塞队列,可选的队列有·ArrayBlockingQueue、·LinkedBlockingQueue、·SynchronousQueue和·PriorityBlockingQueue。

6、ThreadFactory threadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。

7、RejectedExecutionHandler handler:饱和策略,当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。根据应用场景需要来实现RejectedExecutionHandler接口自定义策略,不过在JDK 1.5中Java线程池框架提供了以下4种策略。

策略一:AbortPolicy,直接抛出异常。

策略二:CallerRunsPolicy,只用调用者所在线程来运行任务。

策略三:DiscardOldestPolicy,丢弃队列里最近的一个任务,并执行当前任务。

策略四:DiscardPolicy,不处理,丢弃掉。

你可能感兴趣的:(多线程)