ThreadPoolExecutor是一个服务(ExecutorService
),用来执行被提交过来的任务(task)的。通常上,会把任务放到从线程池中的线程去执行。
而ThreadPoolExecutor可以有不同的线程池可以使用。通过不同的创建方法:Executors.new****ThreadPool()
当一个新的任务提交过来后(execute(runnable)
),会根据MaximumPoolSize
和CorePoolSize
两个参数的设置来决定任务的去向。
如果当前的正在运行的线程数大于CorePoolSize
而且小于MaximunPoolSize
且当前的等待队列满了,就会创建一个线程。
也就是说,如果把这两个参数设置成一样的话,就相当于创建了一个FixedThreadPool。而如果把MaximumPoolSize
设置的很大的话,就相当于
创建了一个CachedThreadPool。
线程的存活时间,线程在没有工作的时候,会在经过这么后被释放。如果被设置成很大数的话,很久才能回收资源。不能为零。
如果core pool size 和 maximum pool size 和 队列都满了,需要对刚加入的新任务进行处理。有几种处理方式。
execute()
的这个线程执行任务RejectedExecutionException
这是提供的方式,也可以自己实现RejectedExecutionHandler
接口。
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
}
}
整个生命周期里,在Running、Stop、Shutdown、Tiddying、Terminated之间转换。
用来执行task的。Service的private boolean addWorker(Runnable firstTask, boolean core)
根据状态创建worker,并执行。