多线程之初识线程池
常用参数
注:当线程数量多余核心线程数量,且多余的线程的存活时间超过KeepAliveTime,则会让线程终止
添加线程的规则
参数的特点
内存溢出
当使用无界队列时,不断添加新的线程时,可能会造成内存溢出。
线程池的状态
- 当线程池创建后,初始为 running 状态
- 调用 shutdown 方法后,处 shutdown 状态,此时不再接受新的任务,等待已有的任务执
行完毕 - 调用 shutdownnow 方法后,进入 stop 状态,不再接受新的任务,并且会尝试终止正在
执行的任务。 - 当处于 shotdown 或 stop 状态,并且所有工作线程已经销毁,任务缓存队列已清空,线
程池被设为 terminated 状态。
当有任务提交到线程池之后的一些操作:
- 若
当前线程池中线程数<corepoolsize
,则每来一个任务就创建一个线程去执行。 - 若
当前线程池中线程数>=corepoolsize
,会尝试将任务添加到任务缓存队列中去,若添
加成功,则任务会等待空闲线程将其取出执行,若添加失败,则尝试创建线程去执行这个任
务。 - 若
当前线程池中线程数>= Maximumpoolsize
,则采取拒绝策略
有 4 种拒绝策略
1)abortpolicy 丢弃任务,抛出 RejectedExecutionException
2)discardpolicy 拒绝执行,不抛异常
3)discardoldestpolicy 丢弃任务缓存队列中最老的任务,并且尝试重新提交新的任务
4)callerrunspolicy 有反馈机制,使任务提交的速度变慢。