在ThreadPoolExecutor中的ctl变量中已经解释了线程池中ctl变量中,高3位代表线程池当前的状态,而低28位表示线程池中线程的总数。
而了解了线程池ctl变量的意义后,在线程池中,会调用execute函数来执行任务,在execute函数解析中,可以看到线程池在有任务需要被执行的时候会判断:
而在AddWorker方法中,会返回是否成功创建Worker
WorkerCount
是否大于corePoolSize
,如果不是核心线程的话,那么则判断WorkerCount
是否大于maximumPoolSize
,如果不合法的话,那么直接返回false。WorkerCount
,如果CAS操作失败了的话,那么就重新检查当前线程池状态。decrementWorkerCount
减少WorkerCount
,并且返回false。在线程启动后,会执行runWorker方法,会循环获取Task,然后执行Task中的run方法。
beforeExecute
来告知子类,任务即将被开始执行afterExecute
方法告知子类,任务执行完毕,而在该方法中,如果出现异常,则会将异常通过参数的方式,告知子类,在执行该任务的过程中,发生了某个异常。一旦出现异常,线程会立马终止。在Worker执行完所有任务或者在执行任务的时候发生了异常,会处理工作线程退出,来判断在当前Worker执行完任务之后,是否还需要再重新启动一个新的Worker来处理新任务。
终止线程池的方法有两个ShutDown以及ShutDownNow,调用完之后,线程池就开始进入关闭的状态了。