java中的 线程池

  java中的线程池是运用场景最多的并发框架,几乎全部须要异步或并发执行任务的程序均可以使用线程池。在开发过程当中,合理的使用线程池能带来3个好处。java

  一、下降资源消耗。经过重复利用已建立的线程下降线程建立和销毁形成的消耗。并发

  二、提升响应速度。当任务到达时,任务不须要等到线程建立就能当即执行。框架

  三、提升线程的可管理性。线程是稀缺资源,若是无线的建立,不只会消耗系统资源,还会下降系统的稳定性,使用线程池能够进行统一分配、调优和监控。可是,要作到合理利用线程池,必须对其实现原理了如指掌、异步

9.1线程池的实现原理ide

  当向线程池提交一个任务以后,线程池是如何处理这个任务的呢?来看一下线程池的主要处理流程。源码分析

当提交一个新任务到线程池时,线程池的处理流程以下:spa

 1)、线程池判断核心线程池里的线程是否都在执行任务。若是不是,则建立一个新的工做线程来执行任务。若是核心线程池里的线程都在执行任务,则进入下个流程。
线程

 2)、线程池判断工做队列是否已经满。若是工做队列没有满,则将新提交的任务存储在这个工做队列里。若是工做队列满了,则进入下个流程。设计

 3)、线程池判断线程池的线程是否都处于工做状态。若是没有,则建立一个新的工做线程来执行任务。若是已经满了,则交给饱和策略来处理这个任务。orm

 ThreadPoolExecutor执行execute()方法分下面4中状况:

 1)、若是当前运行的线程少于corePoolSize,则建立新线程来执行任务(注意,执行这一步骤须要获取全局锁)

 2)、若是运行的线程等于或多于corePoolSize,则将任务加入workQueue

 3)、若是没法加入workQueue(队列已满)则建立新的线程来处理任务(注意,执行这一步骤须要获取全局锁)

 4)、若是建立的新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用RejectedExecutionHandler的rejectedExecution方法

 ThreadPoolExecutor用上述步骤的整体设计思路,是为了在执行execute()方法时,尽量的避免获取全局锁(那将是一个严重的可伸缩瓶颈),在ThreadPoolExecutor预热以后(当前运行的线程数大于等于corePoolSize),几乎全部的execute()方法调用都是执行步骤2,而步骤2是不须要获取全局锁。


源码分析:

工做线程:线程池建立线程时,会将线程封装成工做线程Work,Work在执行完任务后,还会循环获取工做队列里的任务来执行,咱们能够冲Work类的run()方法里看到这点。

线程池中的线程执行任务分为两种状况,

一、在execute()方法中建立一个线程时,会将这个线程执行当前任务

二、这个线程执行任务后,会反复从workQueue获取任务来执行

相关文章
相关标签/搜索