对多个线程使用的资源进行集中管理。
当一个线程进入线程池之后,会进行如下的处理步骤:
首先查看核心线程池是否满
如果核心线程池满了,那么查看队列是否满了
如果队列也满了,那么查看临时线程池是否满了
如果临时线程池也满了,那就要根据2.线程池满的处理策略
进行线程处理。
如下图所示:
当调度者需要调度一个线程的时候,按照如下步骤:
就绪态
而不是终止态
,放入线程池中复用。CPU操作密集的任务
某一线程进入等待态而调度下一个线程
的情况;CPU核心数+1
;这样可以保证CPU的效率最高;I/O操作密集的任务
空等
的情况,不利于资源有效利用。注意
对于就绪态
、等待态
等线程状态和生命周期的介绍,可参考这篇博客
线程池的构造方法如下所示:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler);
线程池的创建包含以下参数:
MaximumPoolSize = CorePoolSize + WorkQueue + 临时线程池大小
2.1 默认--拒绝策略handler
有详细论述线程池满了之后,一般的处理方式是丢弃某一线程,并且抛出异常。
Handler有四种策略:
RejectedExecutionException
。