线程池的的作用归根结底就是避免重复创建线程 带来的性能开销。
下面来看看线程池的参数 所代表的意义,已经在线程池启动时所起到的作用。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) 。
corePoolSize :
核心线程大小。
主要作用是减少线程的创建时间和销毁时间。
假设现在corePoolSize设置为 3 ,刚开始工作线程数量为 == 0 ,来了一个任务那么corePoolSize == 1,第一个任务执行完毕,又来了一个线程还是会继续创建线程 去执行任务 而不是交给第一个线程执行,直到创建线程数量 为3。
maximumPoolSize:
最大线程数 。
假设maximumPoolSize设置为5,maximumPoolSize一定是要大于corePoolSize ,比如任务太多3个线程都还在工作,那么会继续创建线程最多再创建2个额外线程。
keepAliveTime
额外线程存活时间。
当创建的两个额外线程执行完任务后,等到设定的时间就会被回收 释放。
workQueue
工作队列。
用于什么场景呢?还是上面的场景。如果任务实在太多了,3个核心线程,2个额外线程 都还在执行任务,现在源源不断还来了很多任务,那么就会被加入到工作队列里面等待被执行。如果一下子分配了太多的任务工作队列会出现OOM ,为啥呢?因为使用了无界队列 有多少任务塞多少任务就 任务居多 就会出现OOM。那么怎么解决呢?采用有界队列 当workQueue达到预期值时就不要再塞任务了。
threadFactory
线程工厂。
顾名思义就是创建线程的工厂
RejectedExecutionHandler
拒绝策略。
啥时候会触发呢?比方说上面的场景任务巨多,还在给我安排任务,那么就会抛出 此异常 RejectedExecutionException。让其它线程去处理。
线程池提供了 AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy,自定义这五种拒绝策略,默认是 AbortPolicy。
网友评论